2012-02-28 26 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