关于不同C编译器对__attribute__特性的支持情况咨询
__attribute__相关问题解答
1. __attribute__是不是只有GNUC支持?
当然不是。除了GCC(也就是你说的GNUC),Clang、Intel的ICC编译器,还有不少嵌入式领域的编译器(比如ARM GCC、Keil的ARM编译工具链)都支持__attribute__语法,只是部分特性的具体实现可能略有差异。比如Clang为了兼容GCC生态,几乎实现了所有常用的__attribute__特性。
2. 你提到的那两种宏写法算不算通用合理的做法?
两种都是适配非GNU系编译器的常规操作,有合理性,但要注意细节:
- 第一种用
#if defined (__GNUC__)包裹代码:只在GNU系编译器下启用对齐属性,其他编译器直接跳过这段代码。好处是不会给不支持的编译器抛语法错误,但缺点是非GNU编译器下无法获得对齐优化的收益。 - 第二种用空宏定义
__attribute__(x):让不支持的编译器直接忽略这个语法,写法更简洁,但要注意部分编译器可能把__attribute__当作保留关键字,直接定义可能触发警告(比如开启严格编译模式时)。更稳妥的写法是明确指定哪些编译器不定义这个宏:#if !defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) #define __attribute__(x) #endif
3. __attribute__有没有C标准支持?
没有,它是GNU的编译器扩展,不属于任何C标准(不管是C99、C11还是C17)。不过C11标准里引入了_Alignas关键字,这是标准规定的对齐语法,可移植性比__attribute__强得多。
4. 有没有更优的实现方案?
优先用C标准的_Alignas,搭配条件编译兼容旧编译器,这样兼顾标准性和兼容性:
#if __STDC_VERSION__ >= 201112L // C11及以上版本,用标准对齐关键字 short xxxyyy[aaa_SIZE] _Alignas(32); #elif defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) // 支持__attribute__的编译器,用GNU扩展 short xxxyyy[aaa_SIZE] __attribute__((aligned(32))); #else // 其他编译器,不做对齐处理 short xxxyyy[aaa_SIZE]; #endif
这种方案先优先用标准语法保证最大可移植性,再给支持扩展的编译器提供优化,是比较稳妥的做法。
内容的提问来源于stack exchange,提问作者shinhou shu
相关产品推荐
相关产品推荐

