【问题标题】:-Wundef is not being ignored with pragma in g++-Wundef 不会被 g++ 中的编译指示忽略
【发布时间】:2016-08-08 13:53:59
【问题描述】:

给定以下代码:

#if MACRO_WITHOUT_A_VALUE
int var;
#endif

int main(){}

编译时使用g++ -std=c++1z -Wundef -o main main.cpp,
它会产生以下警告:

main.cpp:1:5: warning: "MACRO_WITHOUT_A_VALUE" is not defined [-Wundef]
 #if MACRO_WITHOUT_A_VALUE
     ^

我希望保持启用警告标志,但禁止显示此特定实例。
我应用以下内容:

#ifdef __GNUC__
#pragma GCC diagnostic ignored "-Wundef"
#pragma GCC diagnostic push
#endif

#if MACRO_WITHOUT_A_VALUE
int var;
#endif

#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif

int main(){}

这只能解决clang++ 中的问题。

命令 clang++ -std=c++1z -Wundef -o main main.cpp 构建时没有警告。
命令 g++ -std=c++1z -Wundef -o main main.cpp 构建时带有与以前相同的 [-Wundef] 警告。

如何在g++ 中抑制-Wundef 警告?

g++ (Ubuntu 5.1.0-0ubuntu11~14.04.1) 5.1.0
clang version 3.8.0

【问题讨论】:

  • 你能用#if defined(MACRO_WITHOUT_A_VALUE) && MACRO_WITHOUT_A_VALUE吗?
  • 也许,但我正在包装我不想修改的第 3 方代码。
  • 然后把它换成#ifdef
  • @Ryan 这就是我现在正在做的事情。我希望我可以在不知道内部宏的情况下获得某种全面的信息。比如:#include "push_all_warnings.hpp" #include "3rd_party.hpp" #include "pop_all_warnings.hpp"
  • 你有 ignoredpush 指令向后,但这是一个已知的 GCC 问题。 gcc.gnu.org/bugzilla/show_bug.cgi?id=53431

标签: c++ g++ compiler-warnings clang++ pragma


【解决方案1】:

当第三方标头引发警告时,我之前所做的是将它们包装在我自己的私有标头中,该标头使用#pragma GCC system_header 来使来自该标头的所有警告静音。我使用自己的包装器来保持包含整洁,并在未来需要时允许额外的自定义点。

【讨论】:

    【解决方案2】:

    这不是禁用警告,而是修复预处理器代码以避免它。 以下测试基于类似问题here,使用clang -Weverything...

    #define ZERO 0
    #define ONE 1
    #define EMPTY
    
    // warning: 'NOTDEFINED' is not defined, evaluates to 0 [-Wundef]
    #if NOTDEFINED
    #warning NOTDEFINED
    #endif
    
    // false
    #if ZERO
    #warning ZERO
    #endif
    
    // true
    #if ONE
    #warning ONE
    #endif
    
    // error: expected value in expression
    #if EMPTY
    #warning EMPTY
    #endif
    
    // false
    #if defined(NOTDEFINED) && NOTDEFINED
    #warning NOTDEFINED
    #endif
    
    // false
    #if defined(ZERO) && ZERO
    #warning ZERO
    #endif
    
    // true
    #if defined(ONE) && ONE
    #warning ONE
    #endif
    
    // error: expected value in expression
    #if defined(EMPTY) && EMPTY
    #warning EMPTY
    #endif
    

    一个班轮#if defined(SOME_MACRO) && SOME_MACRO可以避免这个警告。明确处理案件...

    #if defined(DEBUG_PRINT)
    #if DEBUG_PRINT
    ... true
    #else
    ... false
    #endif
    #else
    #error DEBUG_PRINT must be defined
    #endif
    

    要处理EMPTY,请参阅:How to test if preprocessor symbol is #define'd but has no value?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      相关资源
      最近更新 更多