C/C++技巧
+ -

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)相当于栈帧的结束,中间声明的警告信息相当于函数中间的临时变量,只适用于此栈帧,但在此栈帧可以安全地使用调用此函数上栈帧的所有变量。

0 篇笔记 写笔记

C/C++技巧 布尔型警告
在返回bool型变量时,但我们有时会返回int等非bool型变量,当然编译器会自动进行类型的转换,代码运行的结果也会返回我们所期望的结果,但就是在编译过时产生一个警告信息。当然少了我们可以忽略不计,但如果工程太大,这样的警告太多,和编译输出错误混在一起,很不利于我们代码的非错。如有下代码:// t......
C/C++技巧 禁用或启用某个警告
在编写C/C++代码时,过多的警告输出信息会大大降低编译速度,同时也会降低我们对代码错误的排查速度。警告信息一般是通过手动修改代码来完成,但对有些警告信息我们认可但又不想让编译器提示时,我们就可以使用#pragma warning来禁用某些警告信息。pragma warning不仅可以用来禁用......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!