c - 最好的跨平台对齐宏?
问题描述
__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
^
解决方案
问题不在于您在 macOS 上的 clang,而是其他编译器允许alignas()
(实际上是_Alignas()
C 中的宏)1在typedef
(大概是作为扩展名)上。
来自cppreference(加粗矿):
说明
_Alignas
符只能在声明不是位字段且没有寄存器存储类的对象时使用。它不能在函数参数声明中使用,也不能在 typedef 中使用。
或者,从此草案 C11 标准:
6.7.5 对齐说明符
…<br/> 约束
2 对齐属性不得在声明中指定typedef
,或位域,或函数,或参数,或用register
存储类说明符声明的对象。
1该alignas
关键字是在 C++11 标准中引入C++的;ISO C11 将其添加为_Alignas
关键字的“别名”。从C++ 版本的 cppreference:
在 ISO C11 标准中,C 语言具有
_Alignas
关键字,并定义alignas
为扩展至标题中关键字的预处理器宏<stdalign.h>
。
推荐阅读
- liferay - java.util.zip.ZipException:将战争部署到 websphere 时打开 zip 文件时出错
- angular-cli - 构建完成后是否可以更改 index.html 文件中的脚本路径?
- javascript - 我必须使用 Session Storage 还是 LocalStorage : javascript AWS
- java - 如何在 Java Selenium WebDriver 主窗口的特定菜单中滚动鼠标
- angularjs - 与 ag-grid v19 相关的 templateUrl 问题
- mysql - 如何在没有 OUT 参数的情况下在另一个过程中获取过程结果
- android - Aws cognito presigned url 在令牌过期时收到错误
- python - 如何在使用 QuTiP 绘制 Bloch 球体时给出 aplot 标题
- tortoisesvn - TortoiseSVN 日志消息离线存储库
- c++11 - 不带C++11的最新版breakpad