我试图找出为什么我的c编译器在下面(简化的)代码中没有给出警告/错误。
函数声明没有参数,而函数实现有参数:
some.h:
void foo();
ome.c:
static uint32_t count = 0;
void foo(uint32_t num) {
count += num;
print("Count: %u");
}main.c:
foo(100);
foo();输出:
Count: 100
Count: 100用于目标构建的编译器:
gcc-arm-none-eabi-4_9-2015q1-20150306-win32用于目标构建的链接器:
gcc-arm-none-eabi-4_9-2015q1-20150306-win32Compiler-Flags:
-Wall -Werror -DuECC_CURVE=uECC_secp256r1 -DMEMORY_CHECK -DDEBUG -Os -g3 -DBACKTRACE
发布于 2016-09-09 12:03:08
由于向后兼容性,下面的声明如下
void foo();它不声明不带参数的函数,而是声明一个函数,该函数接受未知类型的参数数未知。
这意味着您的两个调用都是正确的,编译器不能真正警告您。
另一个问题是源文件中的声明实际上与头文件中的声明相匹配,这只会使它更加精确。因此,您也不会收到警告或错误。
发布于 2016-09-09 12:02:22
在C中,这个函数声明
void foo();意味着在声明的点上不知道函数参数。
从函数调用中推导出参数的类型和个数。
至于你的节目,那么这个电话
foo();具有未定义的行为,因为参数数和参数数量不匹配。
https://stackoverflow.com/questions/39411110
复制相似问题