我有以下关于在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
的 namespace 中有一个struct st2
(因此为st2::st1
,但是我不会为您提供它的属性!”由于您未提供其属性,因此编译器将引发“不完整类型”错误:它不知道此类型的大小,因此无法解析
sizeof
。如果要在
struct st1
中包含struct st2
的实例,则应编写:struct st1 my_variable_name;
这将有效地在
struct st1
中添加struct st2
的实例。如果您不想在
struct st1
中添加struct st2
的实例,只需删除这一行-编译器已经知道struct st1
,因为它已在上面声明。关于c++ - 在C中正确编译结构对齐,在C++中失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15756198/