gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:56:17 27 4
gpt4 key购买 nike

我有以下关于在 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 st2 的命名空间中有一个 struct st1(因此 st2::st1),但我不会给你它的属性!”由于您未提供其属性,编译器将引发“不完整类型”错误:它无法了解此类型的大小,因此无法解析您的 sizeof

如果你想在你的struct st2中有一个你的struct st1的实例,你应该这样写:

struct st1 my_variable_name;

这将有效地在您的 struct st2 中添加您的 struct st1 的实例。

如果您不想在您的struct st2 中使用您的struct st1 实例,只需删除这一行——您的编译器已经知道struct st1 ,因为它是在上面声明的。

关于c++ - 结构对齐在 C 中编译正常,在 C++ 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15756198/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com