我有两个用C编写的应用程序包含相同的头文件。在这个标题中,我有一个结构的声明。我使用GCC编译器来编译这两个应用程序。
当我执行这两个应用程序时,它们会生成sizeof(struct-defined-in-the-header)
的不同值。
为什么会这样?
答案 0 :(得分:6)
首先,确保对所有内容进行干净的构建。
如果问题仍然存在,这可能意味着两个翻译单元使用了不同的编译选项。我将捕获用于两个编译的gcc
命令行,并将它们进行比较,特别注意与对齐,结构填充等有关的任何选项。
另一种可能性是结构的定义取决于一些预处理器符号,并且两个转换单元的符号定义不同。使用gcc -E
并比较两个预处理器输出中的结构定义将是一个良好的开端。
答案 1 :(得分:1)
在我的情况下,它不是gcc,它是单个应用程序,但在不同的.c文件中有sizeof(MyStruct)的不同结果。 原因在于结构的不同打包值,因为这些.c文件在包含MyStruct声明的标头之前包含了不同的.h文件集。 我采用的解决方案是创建通用标头,设置适当的打包值,并将其包含在系统和库标题之后的所有.h文件中,但在我的标题之前。
答案 2 :(得分:0)
sizeof
不一个函数。它是一个编译时运算符。
你不知道什么标题会给你带来麻烦。
可能的猜测可能是某些模糊的预处理器技巧正在删除其中的某些字段,或者更改字段的实际类型。例如,假设一个标题foo.h
具有
// in file foo.h
#ifdef FOO_BAR
typedef short number_t;
#else
typedef long number_t;
#endif
和另一个标题bar.h
有
// in file bar.h
#define FOO_BAR
#include "foo.h"
struct barbare_st {
number_t num;
char name[20];
};
要找到答案,您可以使用ptype
调试程序的gdb
命令,或者只是查看使用}获得的某些文件xxx.i
的预处理格式xxx.c
p>
gcc -C -E -Dappropriate_defines -Iinclude_dirs/ xxx.c > xxx.i
答案 3 :(得分:0)
我使用Eclipse编译程序。我检查了编译的标志。看:
gcc -I/lib-header-directory-with-struct -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"program-a.d" -MT"program-a.d" -o"program-a.o" "../program-a.c"
gcc -I/lib-header-directory-with-struct -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"program-b.d" -MT"program-b.d" -o"program-b.o" "../program-b.c"
gcc -L/lib-directory-with-struct -o"program-b" -l<lib-with-struct>
它们之间的区别在于,我使用了lib,而在另一个中我只使用了struct定义。
我使用gcc -E
并将stdout重定向到文件。我在这个文件中查找了struct定义,在两个程序中都是一样的。
答案 4 :(得分:0)
布朗博士评论说,有几种可能性。你应该显示代码。不过,这是另一个猜测。
在其中一个案例中,也许另一个变量是影子struct
?喜欢在:
extern struct { char foo; } bar;
void baz(void) {
long bar;
sizeof bar; /* will be sizeof(long) */
}
void qux(short bar) {
sizeof bar; /* will be sizeof(short) */
}