我花了很多时间调试一个原因是由问题引起的问题 两个源文件,包括两个不同顺序的头文件。 其中一个头定义了_FILE_OFFSET_BITS到64,另一个头定义了 文件包括< sys / types.h>,它将off_t定义为32或64 位长,具体取决于_FILE_OFFSET_BITS的设置。我有 下面列举了这种情况的一个简短例子。这是在x86_32 Linux上 (Debian unstable和CentOS 4.8)。
gcc -Wall main.c other.c,Solaris 9 lint和splint都没有检测到 这种情况。
有没有人知道可以检测到这种情况的软件工具?
#define _FILE_OFFSET_BITS 64 #include <sys/types.h> #include <stdio.h> #include "header.h" int main(int argc, char **argv) { struct foo bar = {(off_t) 0, "foo"}; showproc(&bar); printf("sizeof(off_t) in main.c is %d\n", sizeof(off_t)); return 0; }
#include <sys/types.h> #define _FILE_OFFSET_BITS 64 #include <stdio.h> #include "header.h" void showproc(const struct foo *p) { if (p->offset == 0) { if (p->s == NULL) puts("NULL pointer reference"); else printf("Structure value is %s\n", p->s); } printf("sizeof(off_t) in other.c is %d\n", sizeof(off_t)); }
struct foo { off_t offset; const char * s; }; extern void showproc(const struct foo *);
NULL pointer reference sizeof(off_t) in other.c is 4 sizeof(off_t) in main.c is 8
答案 0 :(得分:4)
我建议在makefile中而不是在代码中添加修改标题的定义。否则,您无法确定哪些编译单元具有一个定义或另一个定义,正如您所经历的那样。
有时用宏修改标题是预期的行为(例如使用标题作为模板),有时它不是(就像你的情况一样),所以我认为很难从工具中产生有意义的警告。
答案 1 :(得分:2)
如果您需要在头文件中定义某些内容,请确保使用它的任何内容都包含该标头。这包括其他标题。