Clang 6.0.1 avxintrin.h具有以下声明:
static __inline __m256i __DEFAULT_FN_ATTRS _mm256_set1_epi32(int)
GCC 5.5具有:
extern __inline __m256i __attribute__((__gnu_inline__, _always_inline__, __artificial__)) _mm256_set1_epi32(int)
为什么一个是extern
而另一个是static
?这在调用inline
的{{1}}函数中向我显示。 Clang希望将其声明为_mm256_set1_epi32
:
static
使用#include <immintrin.h>
inline void SimdBlockBloomFilter_make_mask() {
_mm256_set1_epi32(1);
}
:
-Weverything
使用Clang ++编译时,不会出现此错误 。
答案 0 :(得分:3)
在GCC版本中,gnu_inline
attribute接近于{99}和更高版本的static inline
。
在重新定义extern inline
的含义时,C委员会忽略了GNU的先例:对于GNU编译器,extern inline
意味着编译器永远不应生成该函数的非内联副本(即使地址)。在C99中,extern inline
表示翻译单元中的定义完成了另一个翻译单元中的inline
定义。
<immintrin.h>
的GCC版本使用gnu_inline
属性来获得所有编译器模式(特别是C89 / C90和C99)下的预期行为。