c - GCC 中没有参数检查

标签 c gcc

我写了一个 C 程序,它由下面给出的三个文件组成,位于同一目录中

主.c

#include<stdio.h>
#include "test.h"

int main()
{
        int b=0;
        b = test_add(3,2);
        printf("Added: b=%d\n\n",b);
        return 0;
}

测试.h

int test_add(int a, int b);

测试.c

int test_add(int a, int b, int c)
{
        return a+b+c;
}

我正在使用以下命令编译程序:

$gcc -Wall -Wextra main.c test.c

编译成功。我可以看到调用函数的参数数量与其实际定义不匹配。编译器不会针对此类问题给出任何警告/错误。编译器如何报告此类错误?

最佳答案

这显示了 C 标准的一个奇怪之处。它允许未定义函数等实体。

真正的错误是你没有

#include "test.h"

在你的 test.c 文件中。

这意味着主文件只能看到带有三个参数的函数的版本。当它到达函数调用时,它隐式地声明了带有两个参数的函数。

当您运行它时,您会得到 b 的虚假值。我猜 super 用户的密码可能以某种方式在那里;)

如果添加 include 指令,编译时会出错。

让我担心的是,没有警告,即使使用 -Wall -Wextra -pedantic 也没有。

关于c - GCC 中没有参数检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33796646/

相关文章:

c - gcc -O3 标志会导致警告 -O2 不会

objective-c - 如何获得 NSTask 进程的子进程?

C - 数组不能使用变量作为索引

c++11 - gcc 7.2.0 无法识别 std::expf 和 std::logf

c - 从 max 终端编译 c gsl 库时出现问题

c++ - 在 Visual Studio 中编译 gcc 代码会导致错误 C3646 : '__attribute__' : unknown override specifier

c++ - 将值传递给 main(int, char**)

c - 使用 malloc 时的垃圾值

python - 为什么发送连续的 UDP 消息会导致消息延迟到达?

c - uint32_t * uint32_t = uint64_t vector 与 gcc 相乘