我试着找出为什么我的c编译器没有给出跟随(简化)代码的警告/错误。
函数声明没有参数,而函数实现有参数:
some.h:
void foo();
some.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-win32
编译器标志:
-Wall -Werror -DuECC_CURVE=uECC_secp256r1 -DMEMORY_CHECK -DDEBUG -Os -g3 -DBACKTRACE
答案 0 :(得分:4)
由于向后兼容性,声明如
void foo();
没有声明一个不带参数的函数,它声明了一个函数,该函数接收未知类型的未知数量的参数。
这意味着你的两个调用都是正确的,编译器无法真正警告你。
另一个有问题的是源文件中的声明实际上与头文件中的声明匹配,它只是使它更精确。因此,您也不会收到警告或错误。
答案 1 :(得分:0)
在C这个函数声明中
void foo();
表示在声明中没有任何关于函数参数的信息。
参数的类型和数量是从函数调用中推导出来的。
至于你的节目然后这个电话
foo();
具有未定义的行为,因为参数的数量和参数的数量不匹配。