【问题标题】:C - gcc: no compiler warning with different function-declaration/implementationC - gcc:没有不同函数声明/实现的编译器警告
【发布时间】:2016-09-09 11:59:43
【问题描述】:

我试图弄清楚为什么我的 c 编译器使用以下(简化的)代码没有给我警告/错误。

函数声明没有参数,而函数实现有参数:

some.h:

void foo();

some.c:

static uint32_t count = 0; 

void foo(uint32_t num) {
    count += num;
    print("Count: %u");
}

ma​​in.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

【问题讨论】:

  • 你的编译语句?包括?
  • 我想printprintf。顺便说一句UBUB
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 请注意,这是 C 和 C++ 非常不同的另一种情况。改用 C 的 C++ 程序员往往会错误地写成 () 而不是 (void)

标签: c gcc declaration


【解决方案1】:

由于向后兼容,声明如下

void foo();

不声明一个不带参数的函数,它声明一个带未知数量的未知类型参数的函数。

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

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

【讨论】:

  • 这里是一个不带参数的函数声明:void foo(void);
【解决方案2】:

在 C 中这个函数声明

void foo();

表示在声明点对函数参数一无所知。

参数的类型和数量由函数调用推导出来。

至于你的程序然后这个调用

foo();

由于参数的数量和参数的数量不匹配而导致行为未定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2019-08-06
    • 1970-01-01
    • 2016-07-30
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多