首页 > 解决方案 > 静态与外部内在函数

问题描述

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调用_mm256_set1_epi32. Clang希望它被声明static

#include <immintrin.h>

inline void SimdBlockBloomFilter_make_mask() {
  _mm256_set1_epi32(1);
}

-Weverything

warning: static function '_mm256_set1_epi32' is used in an inline
function with external linkage [-Wstatic-in-inline]

使用 Clang++ 编译时不会出现此错误。

标签: cgccstaticclangintrinsics

解决方案


在 GCC 版本中,该gnu_inline属性接近于static inlineC99 及更高模式中的行为。

C 委员会在重新定义以下含义时忽略了 GNU 的先例extern inline: 对于 GNU 编译器,extern inline意味着编译器永远不应生成函数的非内联副本(即使其地址已被占用)。在 C99 中,extern inline表示一个翻译单元中的inline定义完成了另一个翻译单元中的定义。

GCC 版本<immintrin.h>使用该gnu_inline属性在所有编译器模式(特别是 C89/C90 和 C99)中获得预期的行为。


推荐阅读