将alignas()应用于C中的整个结构

时间:2017-10-02 01:53:18

标签: c c11

我希望可以将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);

也会抛出语法错误(虽然不同)。

1 个答案:

答案 0 :(得分:3)

C11对这些事情并不十分清楚,但已经达成共识,如何解释这一点。 C17将有一些澄清。不允许类型对齐的想法是,编译单元之间的兼容类型永远不应存在不同的对齐要求。如果要强制struct类型的对齐,则必须在第一个成员上强制对齐。通过这种方式,您将创建一个不兼容的类型。

委员会投票的“约束”部分的开头是:

  

对齐说明符只能出现在声明说明符中   声明,或成员的说明者限定符列表   声明,或复合文字的类型名称。对齐   说明者不得与任何一个一起使用   存储类说明符typedefregister,也不在声明中   函数或位域。