我试图弄清楚为什么我的C编译器使用以下(简化的)代码不会给我任何警告/错误。
函数声明没有参数,而函数实现则具有参数:
some.h:
void foo();
some.c:
static uint32_t count = 0;
void foo(uint32_t num) {
count += num;
print("Count: %u");
}
Run Code Online (Sandbox Code Playgroud)
main.c:
foo(100);
foo();
Run Code Online (Sandbox Code Playgroud)
输出:
Count: 100
Count: 100
Run Code Online (Sandbox Code Playgroud)
用于目标构建的编译器:
gcc-arm-none-eabi-4_9-2015q1-20150306-win32
Run Code Online (Sandbox Code Playgroud)
用于目标构建的链接器:
gcc-arm-none-eabi-4_9-2015q1-20150306-win32
Run Code Online (Sandbox Code Playgroud)
编译器标志:
-Wall -Werror -DuECC_CURVE=uECC_secp256r1 -DMEMORY_CHECK -DDEBUG -Os -g3 -DBACKTRACE
由于向后兼容,因此声明如下
void foo();
Run Code Online (Sandbox Code Playgroud)
没有声明不带参数的函数,而是声明了带未知数量的未知类型参数的函数。
这意味着您的两个调用都是正确的,并且编译器无法真正警告您。
另一个有问题的是,源文件中的声明实际上与头文件中的声明匹配,只是使其更加精确。因此,您也不会在那里收到警告或错误。