【问题标题】:VC++ Compiler: How to determine the current warning level or overrides?VC++ 编译器:如何确定当前的警告级别或覆盖?
【发布时间】:2009-06-10 15:17:47
【问题描述】:

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

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

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

我无法告诉你,当调用者违反合同并试图向我发送整数而不是带符号字节(有导致了我正在尝试解决的当前错误)。

想法?

注意事项:

在我的整个解决方案中搜索#pragma 只得到平衡的#pragma 警告(禁用:xxxx)声明,然后是#pragma 警告(默认值:xxxx)。这些都没有引用 4244。

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

在整个 MS 中对 4244 的搜索包括返回一些引用,看起来是平衡的,或者几乎是平衡的,这取决于在调用它们之前设置的#define 符号。因此,我怀疑 MS 有过错(再加上 MS 之前在他们的标题中做草率工作的历史)。

【问题讨论】:

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


    【解决方案1】:

    另一种选择是添加this

    #pragma warning (defualt) 
    

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

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

    【讨论】:

    • 该语法在 VS 2008 下被拒绝。它希望将特定警告重置为默认值。所以我必须使用 #pragma 警告(默认值: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文件 (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include\atldbcli.h(38):#pragma warning(disable: 4244)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        经过进一步调查:

        /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(error:4244) // 这完全启用警告,以防止在所有情况下由于隐式类型转换导致可能的数据丢失,而不管活动警告级别如何

        成功了。

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

        感谢您的帮助!

        【讨论】:

          猜你喜欢
          • 2010-09-28
          • 1970-01-01
          • 2016-06-17
          • 1970-01-01
          • 2023-03-14
          • 2022-06-10
          • 1970-01-01
          • 2011-01-16
          • 2023-03-19
          相关资源
          最近更新 更多