2011-11-15 25 views
2

我在我的項目中使用全局「config.h」來定義啓用/禁用功能的各種標誌。如何防止忘記包含我的「config.h」?

#define ENABLE_FEATURE1 0 // feature is disabled 
#define ENABLE_FEATURE2 1 // feature is enabled 
在源文件中

後來我測試了他們:我使用的約定定義

#if ENABLE_FEATURE1 
    // do something 
#endif 
#if ENABLE_FEATURE2 
    // do something 
#endif 

然而,它已經發生了幾次,我忘了,包括在「config.h中」測試這些標誌的cpp文件。然後,我沒有從預處理器中得到任何錯誤或警告,並且程序編譯正常,但編譯器將所有未定義的標誌視爲設置爲零,因此該功能在該cpp文件中被視爲禁用,而它被視爲在其他源文件中啓用。

即使在運行時,其後果並不明顯。

回答

3

在源文件中插入以下#if

#if !defined(ENABLE_FEATURE1) && !defined(ENABLE_FEATURE2) 
#error "Please include <config.h>" 
#endif 

然後,你可能有另外一個問題:如果我忘了插入上述#ifdef? :)

在這種情況下,您可能會將config.h包含在預編譯頭文件中(例如,stdafx.h),並使用預編譯頭文件打開。如果文件不包括stdafx.h,MSVC將引發錯誤。

最後,您可以編寫一個簡單的腳本來檢查每個源代碼是否有config.h

3

這不是最好的也不是最優的方式,但肯定是最簡單的。
config.h中添加虛擬變量的聲明並訪問需要包含config.h的cpp文件中的變量。
如果頭沒有包括它會給你編譯錯誤。

0

您可以簡單地使用#ifndef來測試定義。

#ifndef ENABLE_FEATURE1 
    #error "someshizzle" 
#endif 
#if ENABLE_FEATURE1 
    // do something 
#endif 
0

具有二重性制定的config.h:

#define ENABLE_FEATURE1 1 
#define DISABLE_FEATURE1 !ENABLE_FEATURE1 

,然後使用elif從句,:

#ifdef ENABLE_FEATURE1 
[...enabled code...] 
#elif DISABLE_FEATURE1 
[...disabled code...] 
#else 
#error "config.h is not included" 
#endif 
1

使用一些文本搜索器,其通過你的文件抓取。如果你沒有包含它,觸發一個觸發這個的USB端口:link :)

SCNR

相關問題