首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中对整个结构应用对齐()

在C中对整个结构应用对齐()
EN

Stack Overflow用户
提问于 2017-10-02 01:53:18
回答 1查看 6.4K关注 0票数 7

我期望可以将对齐/_Alignas应用于整个struct声明,如下所示:

代码语言:javascript
复制
#include <stddef.h>
#include <stdalign.h>

struct alignas(max_align_t) S {
  int field;
};

struct S s = { 0 };

但是gcc和clang都拒绝这一声明:

(gcc 6.3)

代码语言:javascript
复制
test.c:4:8: error: expected ‘{’ before ‘_Alignas’
 struct alignas(max_align_t) S {
        ^

(clang 3.8)

代码语言:javascript
复制
test.c:4:1: error: declaration of anonymous struct must be a definition
struct alignas(max_align_t) S {
^

怎么回事?请注意,如果我将文件编译为C++,或者将alignas替换为等效的GCC扩展名,则两个编译器都接受此结构,

代码语言:javascript
复制
struct __attribute__((aligned(__alignof__(max_align_t)))) S {
  int field;
};

还请注意,alignas的其他合理位置,

代码语言:javascript
复制
alignas(max_align_t) struct S { ... };
struct S alignas(max_align_t) { ... };
struct S { ... } alignas(max_align_t);

还抛出语法错误(尽管不同)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-02 09:02:26

C11在这些问题上还不太清楚,但已经形成了一个共识,即如何解释这一点。C17将澄清其中的一些问题。不允许对齐类型的想法是,对于编译单元之间的兼容类型,永远不应该有不同的对齐要求。如果要强制对齐struct类型,则必须将对齐强加于第一个成员。这样您就会创建一个不兼容的类型。

委员会表决的“限制”一节的开始内容如下:

对齐说明符只能出现在声明的声明说明符中,或者出现在成员声明的说明符-限定符列表中,或者出现在复合文字的类型名称中。对齐说明符不应与存储类说明符typedefregister结合使用,也不得用于函数或位字段的声明。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46518575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档