c - 静态与外部内在函数
问题描述
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++ 编译时不会出现此错误。
解决方案
在 GCC 版本中,该gnu_inline
属性接近于static inline
C99 及更高模式中的行为。
C 委员会在重新定义以下含义时忽略了 GNU 的先例extern inline
: 对于 GNU 编译器,extern inline
意味着编译器永远不应生成函数的非内联副本(即使其地址已被占用)。在 C99 中,extern inline
表示一个翻译单元中的inline
定义完成了另一个翻译单元中的定义。
GCC 版本<immintrin.h>
使用该gnu_inline
属性在所有编译器模式(特别是 C89/C90 和 C99)中获得预期的行为。
推荐阅读
- dynamics-crm - Dynamics CRM 上线,抛出 System.Security.Permissions.KeyContainerPermission
- multithreading - 如何在不影响应用程序安全的情况下使用 websockets 超时?
- html - 使用小型设备时,我网站右侧的空白区域
- javascript - ng generate @angular/material:material-nav --name=main-nav 正确生成文件但它们不运行
- python - python FileNotFoundError: [Errno 2] 具有绝对路径和文件存在
- arrays - Swift:数组引用作为对象属性?
- c++ - C++:我可以重用/移动 std::list 元素从中间到结尾吗?
- python - python中的'TypeError:zip参数#1必须支持迭代'
- swift - Swift 协议扩展 - 无法访问 Func
- c++ - 创建具有对齐内存的 Direct3D 表面?