关于C++代码`int a[2] alignas(16) [5];`的标准合规性及正确编译行为问询
关于C++代码
int a[2] alignas(16) [5];的标准合规性及正确编译行为问询 我来给你拆解清楚这个问题哈:
首先,你的这段代码int a[2] alignas(16) [5];是不符合C++标准语法要求的,Clang的拒绝才是严格遵循标准的正确行为,而GCC和MSVC是因为做了非标准的语法扩展才接受了它。
咱们从C++标准的语法规则说起:在声明数组类型的时候,对齐说明符alignas的放置位置是有明确规定的——它要么用于修饰整个对象(放在类型或变量名的最前面),要么用于修饰嵌套的数组元素类型,但绝对不能像你这样,在两个数组维度的声明中间插入alignas。
举个例子,如果你想让整个二维数组a(类型为int[2][5])对齐到16字节,正确的写法应该是:
alignas(16) int a[2][5];
如果你的需求是让每个int[2]类型的子数组都对齐到16字节,那正确的写法可以是这样:
// 写法1:用括号明确分组 int (alignas(16) a[5])[2]; // 写法2:用类型别名让代码更清晰 using Int2Array = alignas(16) int[2]; Int2Array a[5];
GCC和MSVC之所以能通过编译,是因为它们对C++语法做了一些宽松的扩展,允许这种不符合标准的写法,但这种写法是不可移植的——换用严格遵循标准的编译器(比如Clang)就会报错,所以不建议这么写。
备注:内容来源于stack exchange,提问作者user19414420
相关产品推荐
相关产品推荐

