首页 > 解决方案 > 最好的跨平台对齐宏?

问题描述

__declspec(align(X))
__attribute((aligned(X)))

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

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

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

标签: c

解决方案


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

来自cppreference(加粗矿):

说明_Alignas符只能在声明不是位字段且没有寄存器存储类的对象时使用。它不能在函数参数声明中使用,也不能在 typedef 中使用

或者,从此草案 C11 标准

6.7.5 对齐说明符

…<br/> 约束
2 对齐属性不得在声明中指定typedef,或位域,或函数,或参数,或用register存储类说明符声明的对象。


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

在 ISO C11 标准中,C 语言具有_Alignas关键字,并定义alignas为扩展至标题中关键字的预处理器宏<stdalign.h>


推荐阅读