(我发现这个问题很相似但不是重复的: How to check validity of header file in C programming language )
我在头文件中有一个函数实现和一个不匹配的原型(prototype)(名称相同,类型不同)。头文件包含在使用函数的 C 文件中,但不包含在定义函数的文件中。
这是一个最小的测试用例:
header.h:
void foo(int bar);
文件1.c:
#include "header.h"
int main (int argc, char * argv[])
{
int x = 1;
foo(x);
return 0;
}
文件 2.c:
#include <stdio.h>
typedef struct {
int x;
int y;
} t_struct;
void foo (t_struct *p_bar)
{
printf("%x %x\n", p_bar->x, p_bar->y);
}
我可以使用 VS 2010 编译它,没有错误或警告,但毫不奇怪,当我运行它时它会出现段错误。
- 编译器没问题(这个我理解)
- 链接器没有捕捉到它(这点我有点吃惊)
- 静态分析工具(Coverity)没有捕捉到它(这让我很惊讶)。
我怎样才能捕捉到这些类型的错误?
[编辑:我意识到如果我也在 file2.c
中 #include "header.h"
,编译器会报错。但是我有一个巨大的代码库,并不总是能够或适本地保证所有函数原型(prototype)的头文件都包含在实现文件中。]
最佳答案
在 file1.c
和 file2.c
中包含相同的头文件。这几乎可以防止原型(prototype)冲突。
否则,编译器无法检测到这样的错误,因为编译器在编译file1.c
时,函数的源代码对编译器是不可见的。相反,它只能信任已提供的签名。
至少理论上,如果目标文件中存储了额外的元数据,链接器可以检测到这种不匹配,但我不知道这是否可行。
关于c - 头文件中的函数原型(prototype)与定义不匹配,如何捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15137702/