我有以下关于结构的来源,在 gcc 4.4.6 中编译正常:
struct st1
{
char name[12];
int heartbeat ;
double price ;
int iFlag ;
} ;
struct st2 {
struct st1 ;
char pad[64 - sizeof(struct st1)] ;
} __attribute__((aligned(64))) ;
int main (void)
{
printf("length of struct st2=(%d)\n",sizeof(struct st2) ) ;
}
gcc -fms-extensions test1.c -o test1.exe
./test1.exe ===> length of struct st2=(64)
我将 test1.c 复制到 test1.cpp 并尝试编译为:
g++ -fms-extensions test1.cpp -o test1.exe
然后我得到:
test1.cpp:23:错误:sizeof 对不完整类型 st2::st1 的无效应用
我知道这个错误显示 char pad[64 - sizeof(struct st1)] ;在 g++ 中不起作用, 虽然它可以在 gcc 中工作,但如果我喜欢它在 g++ 中工作,我该怎么办?
在你的结构 st2 中:
struct st1 ;
这是
struct st1
的前向声明。
在这里,你基本上是在对你的编译器说:“嘿,在 struct st1
的命名空间中有一个 struct st2
(因此是 st2::st1
),但我不会给你它的属性!”
由于您没有提供其属性,编译器将引发“不完整类型”错误:它无法知道此类型的大小,因此无法解析您的 sizeof
。
如果您想在
struct st1
中拥有 struct st2
的实例,您应该写:
struct st1 my_variable_name;
这将有效地在您的
struct st1
中添加 struct st2
的实例。
如果您不想在
struct st1
中出现 struct st2
的实例,只需删除此行 - 您的编译器已经知道 struct st1
,因为它已在上面声明。
删除“结构”并仅使用 sizeof(st1)。通过添加“struct”,您可以告诉编译器在 st2 的范围内定义一个新的 struct st1。这就是为什么它说“st2::st1”。