在禁用SDL检查的发行版配置中编译以下代码:
#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 ==========为什么在这种情况下编译器会忽略我的#杂注。我过去曾成功地使用这种方法来抑制相同的警告代码。
发布于 2016-03-28 13:20:53
我从https://msdn.microsoft.com/en-us/library/2c8f766e.aspx复制了这个
对于与代码生成相关的4700-4999范围内的警告数字,当编译器遇到函数的开式大括号时,警告的状态将对函数的其余部分生效。使用函数中的警告杂注来更改数字大于4699的警告的状态,只有在函数结束后才会生效。下面的示例演示如何正确放置警告杂注,以禁用代码生成警告消息,然后恢复该消息。
因此,您可能需要在main开始之前,或者在lambda开始工作之前,将该实用化,但我不确定。
https://stackoverflow.com/questions/36262702
复制相似问题