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

时间:2016-09-09 11:59:44

标签: 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");
}

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

2 个答案:

答案 0 :(得分:4)

由于向后兼容性,声明如

void foo();

没有声明一个不带参数的函数,它声明了一个函数,该函数接收未知类型的未知数量的参数。

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

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

答案 1 :(得分:0)

在C这个函数声明中

void foo();

表示在声明中没有任何关于函数参数的信息。

参数的类型和数量是从函数调用中推导出来的。

至于你的节目然后这个电话

foo();

具有未定义的行为,因为参数的数量和参数的数量不匹配。