2015-11-17 39 views
14

我有幾個配置文件,每個包含一些布爾宏的定義,設置爲0或1.然後,在我的代碼中,我檢查這樣一個宏決定激活哪部分代碼。現在出現了棘手的部分:我想確保包含我的宏定義的頭文件已包含在內。生成一個錯誤,如果選中布爾宏未定義

在以下示例中,如果我忘記包含包含FOO定義的頭文件,編譯器將打印「world!」,而我希望它會生成一個錯誤。

//in the configuration header file 
#define FOO 1 

//in a cpp file 
#if FOO //I would like this to generate an error if I forgot to include the header file 
#pragma message "Hello" 
#else 
#pragma message "world!" 
#endif 

是否有可能實現這樣的行爲?怎麼樣?

爲了澄清,我不要求how to generate an error if a macro is not defined,但如果是能夠改造#if FOO線,使得,在同一時間,它會檢查布爾值,並且如果沒有被定義FOO產生一個錯誤。

有這將是開發者知道他們的代碼應該包含

SPECIAL_MACRO(FOO) 

其中,在同一時間,檢查FOO的布爾值,好像它是一個#if FOO聲明,並防止點他們忘記了包含定義FOO的標題。

+0

既然C++ 11可以使用'static_assert' –

+2

爲什麼不使用'#ifdef'? – Petr

+0

[如何在C預處理器中生成錯誤和警告?](http:// stackoverflow。com/questions/2221517 /如何生成一個錯誤和警告在c預處理器) –

回答

19

維護大量代碼庫的同事(您好哈特穆特,庫爾特),這個龐大的代碼庫被廣泛配置爲#define,完全出現了同樣的問題。一個簡單的錯誤拼寫,可能在make文件中,可能會導致難以追蹤的細微錯誤。他們的解決方案:使用函數宏!

#if SOME_COND() 
// ... 
#endif 

如果SOME_COND()沒有被定義,而不是一個簡單的SOME_COND將由0,如果未定義被替換的編譯器抱怨。我喜歡它,因爲它可以用於傳輸多個值,而不會將代碼混淆在額外的#ifdef s中。

+1

:-)他們是很好的程序員。當您打開汽車的OEM導航機會時,您正在使用他們的軟件。 –

+0

你能舉一個如何定義SOME_COND的例子嗎? –

+0

@DanKorn最高級別包含其他預處理函數宏定義;後來,在普通的源文件中,他們會對代碼的一部分或不同的變量值進行註釋。 –

0

我認爲可以通過簡單棘手的解決方案解決您的問題。我改變你的代碼如下,我的代碼明白,header.h不存在,並顯示錯誤給我。

#if FOO == 1 
    #pragma message "Hello" 
#elif FOO == 2 
    #pragma message "world!" 
#else 
    throw std::invalid_argument("Header didn't add to project"); 
#endif 

只有您需要更改Foo的初始值。 因爲編譯器在沒有找到FOO時激活Foo == 0,所以你不應該爲你的配置使用0值。您應該爲標題缺席情況保留零。而您必須使用大於零(1,2,3,...)的值。

Foo == 0缺席情況。

符== 1個配置1.

符== 2配置2.

+0

對不起,我想我的回答是重複的。我知道它晚了。 – hamed

相關問題