2012-02-28 28 views
2

美好的一天!從系統頭保護世界其他地方

我目前正在尋找「該」的方式來保護程序的其餘部分從系統相關的頭文件。由於系統頭本身的依賴關係,通常不能將其放入詳細的名稱空間。我的考慮是現在在詳細命名空間中使用extern聲明的變量,並在包含系統頭文件的.cpp文件中給它們一個值。這似乎是一個完美的解決方案,因爲外部世界甚至不知道大部分內容,並且您需要的所有內容都可以打包在詳細的命名空間中。但是有一個問題:你不能用extern常量初始化枚舉常量。

我的問題:是否有任何方法使用枚舉/結構類型與extern變量?或者是否有更好的方法來保護程序免受系統頭文件的影響?

VS11說:

namespace detail 
{ 
    extern const int value; 
} 

const auto val = detail::value; // ok 

enum class my_enum 
{ 
    value = detail::value, // "expression must have a constant value" 
}; 

struct my_struct 
{ 
    static const auto value = detail::value; // "constant value is not known" 
}; 

回答

1

我不知道你想達到什麼樣的,但如果你打算重新定義新常數具有與舊的完全一樣的價值觀,對系統頭文件的依賴保持。

我能想到的第一種去除依賴的方法是用你自己的常量重新定義你自己的包裝中的系統頭功能(如果你想要的話可​​以是枚舉,或者普通常量在標題本身中定義了)。然後在實現文件中包含系統標題,並將常量中的值重新映射到系統標題中的值。

+0

維持依賴關係,是的。但是像這樣的標題包含了其他程序中不需要的東西。 (例如,名爲「max」的宏,不能使用std :: max) - 但是好的,我可以重新映射所有值。如果沒有人有更好的主意,我會將其標記爲答案。 – cooky451 2012-02-28 18:12:18

+0

雖然記住'max'可以在包含windows.h之前用'#define NOMINMAX'解決。您還可以使用「精益和平均」定義。 – 2012-02-28 18:17:55