-2

我有下一个代码:

测试.c

#include "a1.h"


int main() {
    int a = 8;
    foo(a);
    return a;
}

a1.h

void foo (int  a);

a1.c

int f = 0;

void foo (int  a, int b){
    f=5+a+b;
    return;
}

注意 a1.c 中的 foo 比 a1.h 中定义的原型多了 1 个参数。编译器不会发出警告或错误,因此覆盖率:

make all 
Building file: ../src/a1.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/a1.d" -MT"src/a1.d" -o "src/a1.o" "../src/a1.c"
Finished building: ../src/a1.c

Building file: ../src/test.c
Invoking: GCC C++ Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/test.d" -MT"src/test.d" -o "src/test.o" "../src/test.c"
Finished building: ../src/test.c

Building target: test
Invoking: GCC C++ Linker
gcc  -o "test"  ./src/a1.o ./src/test.o   
Finished building target: test

在这些情况下,我该如何为自己辩护?我知道如果我将 #include "a1.h" 添加到 a1.c 文件中,我会得到一个错误,但是有没有办法在没有 "include" 的情况下得到一个错误?

4

2 回答 2

1

编译器没有发出警告,因为它不知道foo(int)from a1.hheader 和foo(int,int)from a1.cfile 是同一个函数。C++ 允许函数重载,因此这两个函数可能共存。这就是为什么 C++ 编译器无法检测到这个问题,所以你需要等到链接阶段。

如果您使用 C 而不是 C++ 进行编译,则只需a1.h在文件顶部包含即可让编译器检测这种情况a1.c

于 2014-12-14T12:19:48.630 回答
0

你超载了foo。只有一个参数的版本永远不会被定义,因此在使用它时你应该得到一个链接器错误。

在这些情况下,我该如何为自己辩护?

你无法保护自己免受函数重载。只需确保您在两个标头中都具有与源文件相同的签名。

于 2014-12-14T12:17:37.543 回答