我希望可以将alignas / _Alignas应用于整个结构声明,如下所示:
#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);
也会抛出语法错误(虽然不同)。
答案 0 :(得分:3)
C11对这些事情并不十分清楚,但已经达成共识,如何解释这一点。 C17将有一些澄清。不允许类型对齐的想法是,编译单元之间的兼容类型永远不应存在不同的对齐要求。如果要强制struct
类型的对齐,则必须在第一个成员上强制对齐。通过这种方式,您将创建一个不兼容的类型。
委员会投票的“约束”部分的开头是:
对齐说明符只能出现在声明说明符中 声明,或成员的说明者限定符列表 声明,或复合文字的类型名称。对齐 说明者不得与任何一个一起使用 存储类说明符
typedef
或register
,也不在声明中 函数或位域。