我目前正在将大型代码库从 VS2013 更新到 VS2019。我遇到的编译器错误之一如下:
内部函数.h(348):错误C3861:“_mm_cvtpd_pi32”:未找到标识符
这个内部函数在 Visual Studio 的“emmintrin.h”中定义。我只在针对 64 位构建时收到此错误。仔细检查会发现,在 2013 年到 2019 年之间,emmintrin.h 的定义从这个改变了:
extern __m64 _mm_cvtpd_pi32(__m128d _A);
extern __m64 _mm_cvttpd_pi32(__m128d _A);
extern __m128d _mm_cvtpi32_pd(__m64 _A);
Run Code Online (Sandbox Code Playgroud)
对此:
#if defined(_M_IX86)
extern __m64 _mm_cvtpd_pi32(__m128d _A);
extern __m64 _mm_cvttpd_pi32(__m128d _A);
extern __m128d _mm_cvtpi32_pd(__m64 _A);
#endif
Run Code Online (Sandbox Code Playgroud)
即:预处理器指令确保函数现在仅可用于 32 位目标。无论目标是什么(64 位或 32 位),产生错误的第 3 方头文件都会使用这些函数。据推测,这里最好的做法是编辑这个头文件,以确保仅对 32 位目标调用此函数。然而,我更好奇的是,为什么从 2013 年到 2019 年发生了变化?我在这里看到了这个函数的描述:
https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_cvtpd_pi32&expand=1705
从一开始它就从未适用于 64 位目标吗?或者它是否已被我需要考虑的 64 位版本替换?