为了标准化我的代码并使其更具可移植性,我替换了
#ifdef __GNUC__
typedef __attribute__((aligned(16))) float aligned_block[4];
#else
typedef __declspec(align(16)) float aligned_block[4];
#endif
和
typedef float alignas(16) aligned_block[4];
在 C++11 中。但是,gnu(4.8)不喜欢这样,但抱怨
test.cc:3:9: warning: attribute ignored [-Wattributes]
typedef float alignas(16) aligned_block[4];
^
test.cc:3:9: note: an attribute that appertains to a type-specifier is ignored
而 clang 3.2 不会产生任何警告(即使使用-Weverything -Wno-c++98-compat -pedantic
)。所以我想知道我上面的代码是否正确,更一般地说,alignas()
可以和不可以放在哪里。
编辑(2013 年 4 月):
标准中的相关条款是 7.6.2,特别是 7.6.2.1
对齐说明符可以应用于变量或类数据成员,但不应应用于位字段、函数参数、catch 子句(15.3)的形式参数或用注册存储类说明符。对齐说明符也可以应用于类或枚举类型的声明。带有省略号的对齐说明符是包扩展 (14.5.3)。
正如 Red XIII 已经挖掘出来的那样。但是,我不够专业,不知道这对我上面的测试意味着什么。
如果 clang 接受我的属性这一事实意味着什么,那么也许值得一提的是,当尝试使用using
指令而不是 atypedef
时,clang 也会抱怨。此外,与此问题早期版本中的声明相反,gcc 不仅警告,而且确实忽略了我对对齐的愿望。