我花了很多时间调试一个问题,结果是由两个源文件引起的,包括两个不同顺序的头文件 . 其中一个头定义了_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都没有检测到这种情况 .
有谁知道可以检测到这种情况的软件工具?
main.c
#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;
}
other.c
#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));
}
header.h
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
2 回答
如果需要在头文件中定义某些内容,请确保使用它的任何内容都包含该头文件 . 这包括其他 Headers .
我建议在makefile中而不是在代码中添加修改 Headers 的定义 . 否则,您无法确定哪些编译单元具有一个定义或另一个定义,正如您所经历的那样 .
有时用宏修改 Headers 是预期的行为(例如使用 Headers 作为模板),有时它不是(就像你的情况一样),所以我认为很难从工具中产生有意义的警告 .