C-gcc:没有使用不同的函数声明/实现的编译器警告

JoJ*_*sUp 1 c gcc declaration

我试图弄清楚为什么我的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

Som*_*ude 5

由于向后兼容,因此声明如下

void foo();
Run Code Online (Sandbox Code Playgroud)

没有声明不带参数的函数,而是声明了带未知数量的未知类型参数的函数。

这意味着您的两个调用都是正确的,并且编译器无法真正警告您。

另一个有问题的是,源文件中的声明实际上与头文件中的声明匹配,只是使其更加精确。因此,您也不会在那里收到警告或错误。

  • 这是一个不带参数的函数声明:`void foo(void);` (7认同)