我有以下关于在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/

10-11 15:43