不工作編譯與SDL檢查發佈配置下面的代碼無效:編譯警告(禁用:4700)在Visual Studio Express的2013
#include <immintrin.h>
int main()
{
const auto Set128Epi16 = []()
{
#ifdef NDEBUG
#pragma warning(push)
#pragma warning(disable : 4700)
__m128i x = _mm_cmpeq_epi16(x,x);
x = _mm_srli_epi16(x,15);
return _mm_slli_epi16(x,7);
#pragma warning(pop)
#else
__m128i x = _mm_setzero_si128();
x = _mm_cmpeq_epi16(x,x);
x = _mm_srli_epi16(x,15);
return _mm_slli_epi16(x,7);
#endif
};
const auto xmm = Set128Epi16();
return *xmm.m128i_i32;
}
給出了以下的輸出:
1>------ Rebuild All started: Project: pragmatic, Configuration: Release Win32 ------
1> main.cpp
1> Generating code
1>e:\projects\pragmatic\pragmatic\main.cpp(10): warning C4700: uninitialized local variable 'x' used
1>e:\projects\pragmatic\pragmatic\main.cpp(10): warning C4700: uninitialized local variable 'x' used
1>e:\projects\pragmatic\pragmatic\main.cpp(10): warning C4700: uninitialized local variable 'x' used
1>e:\projects\pragmatic\pragmatic\main.cpp(10): warning C4700: uninitialized local variable 'x' used
1>e:\projects\pragmatic\pragmatic\main.cpp(10): warning C4700: uninitialized local variable 'x' used
1> Finished generating code
1> pragmatic.vcxproj -> E:\Projects\pragmatic\Release\pragmatic.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
爲什麼編譯器在這種情況下忽略我的#pragma。我在過去成功地使用這種方法來抑制相同的警告代碼。
你爲什麼試圖比較一個未初始化的變量與自身的值?你確實意識到這有未定義的行爲?據我所知,基本上沒有實際用途?也許你可以更多地解釋你在這裏做的實際情況。 –
它被報告爲VS2015中的錯誤。適當地,_mm_cmpeq_epi16()的參數未被初始化。很難猜測這裏有什麼意思,x和x應該等於任何值:) –
@BarryTheHatchet這是一個相當常見的技巧,用於將0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF加載到xmm寄存器中。認爲pxor xmm0,xmm0。寄存器的內容對結果沒有影響。 – chili