2009-06-10 65 views
2

我有一个项目,我刚刚发现警告C4244(可能丢失数据)正在被抑制。我强烈怀疑一些不起眼的MS头部正在压制这个警告,并且对包含所述头部的所有翻译单元进行抑制,但是我还没有确定他们的无数头部中哪些头部可能有问题。因此,像任何其他编程问题一样,我想先做二进制搜索,打印出当前的警告级别,如果可能的话,在我的主要预编译头文件中打印出任何压制的警告。VC++编译器:如何确定当前的警告级别或覆盖?

有没有人知道我可能会使用什么编译器指令,或者我可能采取哪种方法来提供这些信息?

我不能告诉你,如果发现在我的头文件中仔细构造的类型声明无法在调用者违反合同并尝试向我发送一个整数而不是有符号字节时给予编译器警告(这是导致了目前我试图解决的错误)。

想法?

注:通过我的整个解决方案的#pragma

搜索拿出仅有的#pragma均衡声明警告(禁用:XXXX),随后用#pragma警告(默认:XXXX)。并没有那些参考4244.

搜索4244在整个解决方案返回没有匹配(我从来没有重写该警告,也没有任何我包括的库,子项目等)。

在4244上遍及整个MS的搜索包括路径返回几个引用,那么出现要根据在调用它们之前设置的#define符号进行平衡或几乎如此。因此,我怀疑MS是错误的(加上MS在他们的头文件中做了琐碎的工作)。

回答

0

经过进一步调查:

/P花费的时间太长(我从来没有亲眼目睹了越来越超出了近一个小时的过程中的几个文件,所以我取消了构建)

我从来没有能够找到一个明确的方式来打印出当前的警告级别是什么,或者是编译过程中某个特定点有效的覆盖。所以我提出的问题并没有得到真正的答案,除非/ P参数实际上对你有用(正如我提到的,这对我的目的来说是不切实际的)。

我能够做的就是构建在各种标头的一些内嵌调用,应该产生必要的警告,如果警告级别包括该警告的活跃,以验证该警告是活跃与否:

内联int测试(char值){返回++值; }

包括 “东西”

直列INT TEST1(int值){返回试验(值); } //应该产生C4244 - 可能丢失数据如果前面的#include没惹了警戒水位或超控警告4244

等等......

最后,我发现特别是4244有一些与之相关的奇怪规则,除了/ W4(警告等级4)之外,它是有效“禁用”的 - 最高的警告等级。由于该警告级别非常非常敏感,并且抱怨很多事情超出了我们对它们做任何事情的范围,所以我不想启用/ W4。

我所做的却是摆在我们的stdafx.h PCH如下:

编译警告(错误:4244)//这完全能够对可能造成的数据丢失在所有情况下,隐式类型转换,无论警告的主动警告级别

工作正常。

因此,MS没有在他们任何影响我们的文件中留下不平衡的警告覆盖。只是4244非常宽容,除非处于最高警戒水平,无论如何,它对我们来说都变得真正有用​​。

感谢您的帮助!

0

你可以只搜索“C4244”的所有头文件吗?还是只能访问预编译的头文件?

0

您可以先使用/P compiler command line option开始。它将预处理器的输出输出到文件中。通过这种方式,你可以确定它确实是一个头添加了警告禁用并试图收集一些提示,可能是哪个头。

1

另一种选择是在文件的顶部#include小号 这将重置警告,defualt之后添加this

#pragma warning (defualt) 

,丢弃任何忽视这可能已被调用。

在另一个笔记上,我发现微软的头文件不太可能会禁用警告。

+0

该语法在VS 2008下被拒绝。它希望将特定警告重置为默认值。因此,我必须使用#pragma warning(默认值:4244) 我可以找到的唯一标题是指4244: C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ include \ comdef .h(30):#pragma warning(disable:4244) C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ include \ atldb.h(74):#pragma warning(disable:4244) C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ include \ atldbcli.h(38):#pragma warning(disable:4244) – Mordachai 2009-06-10 16:19:58