结构对齐在c中编译正常,在c++中失败

问题描述 投票:0回答:2

我有以下关于结构的来源,在 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++ 中工作,我该怎么办?

c++ struct
2个回答
3
投票

在你的结构 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
,因为它已在上面声明。


0
投票

删除“结构”并仅使用 sizeof(st1)。通过添加“struct”,您可以告诉编译器在 st2 的范围内定义一个新的 struct st1。这就是为什么它说“st2::st1”。

© www.soinside.com 2019 - 2024. All rights reserved.