我期望可以将对齐/_Alignas应用于整个struct声明,如下所示:
#include <stddef.h>
#include <stdalign.h>
struct alignas(max_align_t) S {
int field;
};
struct S s = { 0 };但是gcc和clang都拒绝这一声明:
(gcc 6.3)
test.c:4:8: error: expected ‘{’ before ‘_Alignas’
struct alignas(max_align_t) S {
^(clang 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);还抛出语法错误(尽管不同)。
发布于 2017-10-02 09:02:26
C11在这些问题上还不太清楚,但已经形成了一个共识,即如何解释这一点。C17将澄清其中的一些问题。不允许对齐类型的想法是,对于编译单元之间的兼容类型,永远不应该有不同的对齐要求。如果要强制对齐struct类型,则必须将对齐强加于第一个成员。这样您就会创建一个不兼容的类型。
委员会表决的“限制”一节的开始内容如下:
对齐说明符只能出现在声明的声明说明符中,或者出现在成员声明的说明符-限定符列表中,或者出现在复合文字的类型名称中。对齐说明符不应与存储类说明符
typedef或register结合使用,也不得用于函数或位字段的声明。
https://stackoverflow.com/questions/46518575
复制相似问题