我目前正在将大型代码库从 VS2013 更新到 VS2019。我遇到的编译器错误之一如下:
intrinsics.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);
对此:
#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
即:预处理器指令确保这些函数现在仅可用于 32 位目标。产生错误的第 3 方头文件使用这些函数,而与目标无关(64 位或 32 位)。据推测,这里最好的做法是编辑此头文件以确保仅对 32 位目标调用此函数。然而,我更好奇的是,为什么从 2013 年到 2019 年会发生这种变化?我在这里看到了这个函数的描述:
https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_cvtpd_pi32&expand=1705
它从一开始就不适用于 64 位目标吗?或者它是否已被我需要考虑的 64 位版本替换?