我希望可以将 alignas/_Alignas 应用于整个结构声明,如下所示:
#include <stddef.h>
#include <stdalign.h>
struct alignas(max_align_t) S {
int field;
};
struct S s = { 0 };
但是 gcc 和 clang 都拒绝声明:
(海湾合作委员会 6.3)
test.c:4:8: error: expected ‘{’ before ‘_Alignas’
struct alignas(max_align_t) S {
^
(叮当 3.8)
test.c:4:1: error: declaration of anonymous struct must be a definition
struct alignas(max_align_t) S {
^
是什么赋予了?请注意,如果我将文件编译为 C++,或者将
alignas
替换为等效的 GCC 扩展名,则两个编译器都接受此构造,struct __attribute__((aligned(__alignof__(max_align_t)))) S {
int field;
};
另请注意
alignas
的其他合理位置,alignas(max_align_t) struct S { ... };
struct S alignas(max_align_t) { ... };
struct S { ... } alignas(max_align_t);
还会抛出语法错误(尽管不同)。
最佳答案
C11 对这些事情不是很清楚,但已经形成了如何解释这一点的共识。 C17 将澄清其中的一些内容。不允许类型对齐的想法是编译单元之间的兼容类型永远不应该有不同的对齐要求。如果要强制 struct
类型对齐,则必须对第一个成员进行对齐。这样你就会创建一个不兼容的类型。
委员会投票表决的“约束”部分的开头写道:
关于c - 将 alignas() 应用于 C 中的整个结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46518575/