最好的跨平台对齐宏?

jes*_*tro 1 c

__declspec(align(X))
__attribute((aligned(X)))
Run Code Online (Sandbox Code Playgroud)

这是我遇到过的两个。它们是编译器处理对齐的唯一两种方法吗?

如果我以 C11 为目标,会alignas(X)完成同样的事情,它是否在所有支持 C11 的编译器中实现?在 macOS 上使用 clang 似乎alignas(X)不适用于 typedef?

typedef alignas(16) float vec4[4];
error: '_Alignas' attribute only applies to variables and fields
        ^
Run Code Online (Sandbox Code Playgroud)

Adr*_*ica 6

问题在于 macOS 上的 clang,而在于其他编译器允许(实际上是C 中的alignas()宏) 1(大概是作为扩展)。_Alignas()typedef

\n

来自cppreference(粗体我的):

\n
\n

仅当声明_Alignas不包含位字段且不具有寄存器存储类的对象时才能使用说明符。它不能在函数参数声明中使用,也不能在 typedef 中使用

\n
\n

或者,从这个 C11 标准草案

\n
\n

6.7.5 对齐说明符

\n

\xe2\x80\xa6
\n约束\n2 \xc2\xa0\xc2\xa0\xc2\xa0 不得在、 位域、函数或参数的
声明中指定对齐属性,typedef或使用存储类说明符声明的对象register

\n
\n
\n

1alignas关键字是在 C++11 标准中引入到 C++ 中的;ISO C11 将其添加为关键字的“别名” _Alignas。来自C++ 版本的 cppreference

\n
\n

从 ISO C11 标准开始,C 语言具有_Alignas关键字\n并定义alignas为扩展到标头\n中的关键字的预处理器宏<stdalign.h>

\n
\n

  • @DanielKleinstein 不!然后我得到:*错误:“alignas”属性无法应用于类型*。看起来它是一个 GCC 扩展。尝试一下你的神箭与叮当声...... (2认同)