2017-02-15 36 views
0

我希望你很好。 我有一个文件version.h包含在5 files.c中。 我编译时有5个警告:如何避免来自gcc的多重警告,当我在.h中使用预处理#警告

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 

回答

3

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

+0

你的诊断看起来肯定是正确的,但是“你不能”的结论必须依赖于一些没有说明的关于应该考虑哪种解决方案的假设。 –

+0

感谢您的回馈。你有任何建议来解决我的问题吗? – ruxob

+0

我的假设是OP不想改变多个.c文件的情况,每个文件都包含相同的.h文件。如果OP准备改变(如在你的答案中),那么事情就会改变。但是,我感觉OP正在寻找某种预处理器魔法。如果是这样:“你不能”。 –

0

鉴于你的头文件有一个适当的多重包含守卫,它必须是你的多个警告源自编译多个翻译单元(大致来自单独的C源文件)。每个翻译单元都是独立编译的,因此预计会有多个警告。

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

还有其他可能与您的代码结构相关的问题,例如使用宏和其他预处理器条件来指定特定的翻译单元 - 可能是包含main() - 的那个翻译单元作为发出警告的单元。但是,这样的方法很脆弱,我也不推荐他们。

你最好的选择可能是要么与多个警告一起生活,要么完全压制它们。