C/C++技巧 禁用或启用某个警告
2023-06-06
147
0
在编写C/C++代码时,过多的警告输出信息会大大降低编译速度,同时也会降低我们对代码错误的排查速度。
警告信息一般是通过手动修改代码来完成,但对有些警告信息我们认可但又不想让编译器提示时,我们就可以使用#pragma warning来禁用某些警告信息。
pragma warning不仅可以用来禁用某段代码警告,也可以恢复某些系统某认对某些警告信息的处理。
禁止某些警告
#pragma warning(disable:警告数字代码)
恢复警告默认
#pargma warning(default:警告数字代码)
假如我们用vs2013建新一控制台工程,代码如下:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
float f= 10.2f;
int i = f;
printf("%dn", i);
return 0;
}
编译时会报如下错误
Build started: Project: t, Configuration: Debug Win32 ------
1> t.cpp
1>c:usersadministratordesktopttt.cpp(10): warning C4244: 'initializing' :
conversion from 'float' to 'int', possible loss of data
1> t.vcxproj -> C:\Users\Administrator\Desktopt\Debugt.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
对于我们这种强迫症的人来说,要消除这类警告 如C4244,则可以修改代码如下:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
float f= 10.2f;
#pragma warning(disable:4244)
int i = f;
#pragma warning(default:4244)
int k = f;
printf("%dn", i);
return 0;
}
这时编译输出如下:
1>c:usersadministratordesktopttt.cpp(14): warning C4244: 'initializing' :
conversion from 'float' to 'int', possible loss of data
1> t.vcxproj -> C:\Users\Administrator\Desktopt\Debugt.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
发现第11行的 int i=k;
不再报警,而第14行的int k=f;
会依然报警。
当然有时如果警告的信息太多,有各种警告信息,需要把每一种警告的disable和default都写一遍,真是太费体力,那么有没有一种比较简单省力的书写方式呢?
答案是肯定的。
#pragma warning(push)
#pragma warning(disable:4068) // unknown pragma
#pragma warning(disable:4267)
#pragma warning(disable:4018) //signed/unsigned mismatch
#pragma warning(disable:4127) //conditional expression is constant
#pragma warning(disable:4146)
//代码区
#pragma warning(pop)
使用 #pragma warning(push)
保留当前的警告区,然后添加自己需要设置的警告信息级别,编写代码完成后,然后再使用#pragma warning(pop)
一次将push进去的上面所设置的警告信息,恢复上次警告设制级别。
这个就相当于使用栈一样,#pragma warning(push)
相当于调用一个函数,相当于栈帧的开始,
#pragma warning(pop)
相当于栈帧的结束,中间声明的警告信息相当于函数中间的临时变量,只适用于此栈帧,但在此栈帧可以安全地使用调用此函数上栈帧的所有变量。