2

我有一个项目,我刚刚发现警告 C4244(可能丢失数据)正在被抑制。我强烈怀疑某些糟糕的 MS 标头正在抑制此警告,并为所有包含所述标头的翻译单元保留它,但我尚未确定其无数标头中的哪一个可能有问题。

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

有谁知道我可能使用什么编译器指令,或者我可以采取什么方法来给我这些信息?

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

想法?

笔记:

通过我的整个解决方案对#pragma 进行搜索,只得到平衡的#pragma warning(disable:xxxx) 声明,然后是#pragma warning(default:xxxx)。这些都没有引用 4244。

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

在整个 MS 中搜索 4244 包括返回一些引用的路径,这些引用似乎是平衡的,或者几乎是平衡的,这取决于在调用它们之前设置的#define 符号。因此,我怀疑 MS 有过错(结合 MS 在其标题中草率工作的先前历史)。

4

4 回答 4

1

另一种选择是添加这个

#pragma warning (defualt) 

#includes 之后的文件顶部这会将警告重置为默认值,丢弃任何可能已调用的忽略。

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

于 2009-06-10T15:28:48.697 回答
0

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

于 2009-06-10T15:25:30.577 回答
0

您可以从使用/P 编译器命令行选项开始。它将预处理器的输出输出到文件。这样,您实际上可以确保它确实是一个添加警告禁用的标题,并尝试收集一些关于它可能是哪个标题的提示。

于 2009-06-10T15:25:45.193 回答
0

进一步调查后:

/P 花费的时间太长(我从未目睹它在近一个小时内超过几个文件,所以我取消了那个构建)

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

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

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

包括“某事”

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

等等...

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

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

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

那行得通。

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

谢谢你的帮助!

于 2009-06-10T17:52:08.847 回答