【问题标题】:Protecting the rest of the world from system headers保护世界其他地方免受系统头文件的侵害
【发布时间】:2012-02-29 02:03:23
【问题描述】:

美好的一天!

我目前正在寻找保护程序其余部分免受系统相关头文件影响的“方法”。由于系统标头本身的依赖性,通常无法将其放在详细名称空间中。我现在的考虑是在详细命名空间中使用 extern 声明的变量,并在包含系统头文件的 .cpp 文件中给它们一个值。这似乎是一个完美的解决方案,因为外部世界甚至不知道大部分内容,您需要的所有内容都可以打包在一个详细的命名空间中。但是有一个问题:不能用外部常量初始化枚举常量。

我的问题:有没有办法将枚举/结构类型与外部变量一起使用?还是有更好的方法来保护程序免受系统头文件的影响?

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"
};

【问题讨论】:

    标签: c++ header system


    【解决方案1】:

    我不确定您要达到什么目的,但如果您打算重新定义新常量以使其具有与旧常量完全相同的值,则将保持对系统标头的依赖。

    我能想到的删除依赖项的第一种方法是在您自己的包装器中重新定义系统标头功能,并为每个功能使用您自己的常量(如果您希望它们可以是枚举,也可以是普通常量在标题本身中定义)。然后在实现文件中,包含系统头文件并将常量中的值重新映射到系统头文件中的值。

    【讨论】:

    • 依赖是维护的,是的。但是像 这样的标题包含了程序其余部分中真正不需要的东西。 (例如,一个名为“max”的宏,不能使用 std::max)-但是好的,我可以重新映射所有值。如果没有人有更好的想法,我会将其标记为答案。
    • 虽然记住max可以在包含windows.h之前用#define NOMINMAX解决。您也可以使用“精益和平均”的定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多