【问题标题】:How to avoid multiple warning from gcc when I use pre-processing #warning in a .h当我在.h中使用预处理#warning时如何避免来自gcc的多个警告
【发布时间】:2017-02-15 14:28:30
【问题描述】:

我希望你一切都好。 我有一个文件 version.h 包含在 5 个 files.c 中。 当我编译时,我有 5 个警告:

version.h:10:2: 警告:-- SUB_VERSION2
version.h:10:2:警告:-- SUB_VERSION2
version.h:10:2:警告:-- SUB_VERSION2
version.h:10:2:警告:-- SUB_VERSION2
version.h:10:2:警告:-- SUB_VERSION2

我只想得到一个警告。我在某个网站上查看了一段时间,但我没有发现任何关于这个问题的信息。如何避免这个问题?

这是我的 .h,我的 .c 是随机的:

#ifndef _VERSION_H
#define _VERSION_H

#define SUB_VERSION 1
#define SUB_VERSION SUB_VERSION2

#if (SUB_VERSION == SUB_VERSION2)
   #ifndef WARNING_SUB_VERSION
     #define WARNING_SUB_VERSION
     #warning -- SUB_VERSION2
   #endif

#endif
  #endif
    #endif

【问题讨论】:

    标签: c gcc c-preprocessor


    【解决方案1】:

    你不能。从逻辑上讲,每个.c 文件都是独立于其他文件编译的。这意味着您不能从包含在一个头文件中的头文件发出警告,并在其他头文件中抑制它。

    【讨论】:

    • 你的诊断似乎是正确的,但“你不能”的结论必须依赖于一些关于应该考虑什么样的解决方案的未说明的假设。
    • 感谢您的反馈。您对解决我的问题有什么建议吗?
    • 我的假设是 OP 不想更改多个 .c 文件的场景,每个文件都包含相同的 .h 文件。如果 OP 准备改变它(如你的回答),那么事情就会改变。但是,我觉得 OP 正在寻找某种预处理器魔法。如果是这样:“你不能”。
    【解决方案2】:

    鉴于您的标头具有适当的多重包含保护,因此您的多重警告一定是由多个翻译单元的编译引起的(粗略地说,来自单独的 C 源文件)。每个翻译单元都是独立编译的,因此会出现多个警告。

    您可以通过将所有来源合并到一个翻译单元中来将警告数量减少到一个,但我不特别推荐这样做。

    还有其他与代码结构相关的可能性,例如使用宏和额外的预处理器条件来指定特定的翻译单元(可能包含 main() 的翻译单元)作为发出警告的单元。然而,诸如此类的方法很脆弱,我也不推荐它们。

    您最好的选择可能是忍受多个警告或完全禁止它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 2015-05-11
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多