2017-02-15 71 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() - 的那個翻譯單元作爲發出警告的單元。但是,這樣的方法很脆弱,我也不推薦他們。

你最好的選擇可能是要麼與多個警告一起生活,要麼完全壓制它們。