当我在a .h中使用预处理#warning时,如何避免来自gcc的多个警告

xtfmy6hx  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(128)

我希望你是好的。我有一个文件version.h包含在5 files.c。当我编译我有5个警告:
版本.h:10:2:警告:--子版本2
版本.h:10:2:警告:--子版本2
版本.h:10:2:警告:--子版本2
版本.h:10:2:警告:--子版本2
版本.h:10:2:警告:--子版本2
我只想有一个警告。我在一些网站上看了一段时间,我没有发现任何关于这个问题。如何避免这个问题?
这里是my .h,my .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
c0vxltue

c0vxltue1#

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

mhd8tkvw

mhd8tkvw2#

解决方法是将. h版分割为. h版和. c版。

版本.h文件:

#ifndef _VERSION_H
#define _VERSION_H

#define SUB_VERSION 1
#define SUB_VERSION SUB_VERSION2

#endif /* _VERSION_H */

版本.c文件:

#if (SUB_VERSION == SUB_VERSION2)
#    warning -- SUB_VERSION2
#endif

version.c文件只编译一次。由于头文件中不再有警告,因此警告总数减少为一个。

j0pj023g

j0pj023g3#

假设你的头文件有一个适当的多重包含保护,那么你的多个警告一定是由编译多个翻译单元(大致来说,来自不同的C源文件)引起的。每个翻译单元都是独立编译的,所以多个警告是意料之中的。
通过将所有源代码合并到一个翻译单元中,可以将警告的数量减少到一个,但我并不特别推荐这样做。
还有其他与代码结构相关的可能性,比如使用宏和附加的预处理器条件来指定特定的翻译单元--可能是包含main()的翻译单元--作为发出警告的翻译单元。但是,这种方法很脆弱,我也不推荐使用。
您最好的选择可能是接受多个警告或完全抑制它们。

相关问题