VC ++编译器:如何确定当前警告级别或覆盖?

时间:2009-06-10 15:17:47

标签: visual-c++ compiler-warnings pragma

我有一个项目,我刚刚发现警告C4244(可能丢失数据)被抑制。我强烈怀疑一些糟糕的MS标头是否会抑制此警告,并将其抑制为包含所述标头的所有翻译单元,但我还没有确定哪些翻译单元可能有问题。

所以,像其他任何编程问题一样,我想首先进行二进制搜索,打印出当前警告级别,如果可能的话,在我的主要预编译标题中显示任何被抑制的警告。

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

我无法告诉你,当调用者违反合同并尝试向我发送一个整数而不是一个带符号的字节时,我的标题中我精心构造的类型声明未能给出编译器警告是多么令人讨厌导致我正试图解决的当前错误。)

思想?

注意:

通过我的整个解决方案搜索#pragma只能得到#pragma warning(disable:xxxx)的平衡声明,然后是#pragma warning(默认值:xxxx)。这些都没有提及4244。

在整个解决方案中搜索4244不会返回任何匹配项(我从不覆盖该警告,也不会覆盖任何包含的库,子项目等)。

在整个MS中搜索4244包括路径返回一些引用,出现要平衡,或几乎如此,这取决于在调用它们之前设置的#define符号。因此,我怀疑MS是否有错(加上MS的先前历史记录在他们的标题中做了草率的工作)。

4 个答案:

答案 0 :(得分:1)

另一种选择是添加this

#pragma warning (defualt) 

位于#include之后的文件顶部 这会将警告重置为defualt,丢弃可能被调用的任何忽略。

另一方面,我发现Microsoft标头不太可能禁用警告。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以先使用/P compiler command line option。它将预处理器的输出输出到文件。通过这种方式,您实际上可以确保它真的是一个添加警告禁用的标头,并尝试收集一些关于它可能是哪个标头的提示。

答案 3 :(得分:0)

经过进一步调查:

/ P需要太长时间(我从未目睹过近一个小时内它超出了几个文件,所以我取消了这个版本)

我始终无法找到一种明确的方式来打印出当前警告级别,或者在编译中给定点上有效的任何覆盖。所以我问的问题并没有得到真正回答,除非/ P论证对你有用(正如我所提到的,这对我的目的来说是不切实际的。)

我能够做的是在各种标题中构建一些内联调用,如果警告级别包含该警告为活动状态,则应生成必要的警告,以验证该警告是否处于活动状态:

inline int test(char value){return ++ value; }

包括“某事”

inline int test1(int value){return test(value); } //应该生成C4244 - 如果之前的#include没有弄乱警告级别或覆盖警告4244,可能会丢失数据。

等等......

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

我所做的是将以下内容放在我们的stdafx.h PCH中:

pragma warning(错误:4244)//这完全启用警告,以防止在所有情况下由于隐式类型转换而导致的数据丢失,无论活动警告级别如何

那很有效。

因此,MS没有在影响我们的任何文件中留下不平衡的警告覆盖。只是4244是非常宽容的,除非在最高警戒级别,无论如何它对我们真正有用。

感谢您的帮助!