【问题标题】:C++ namespace in a separate file used by others其他人使用的单独文件中的 C++ 命名空间
【发布时间】:2012-03-28 16:55:20
【问题描述】:

我不断发现我经常希望为程序设置一组“全局”参数——不同文件中的许多不同类使用的变量分别编译。我想将这些参数放在一起,简洁且易于访问,例如

namespace Params {
    static int WindowHeight = 600;
    //...etc.
};

但是,如果将其包含在 a.o 和 b.o 中,“静态”会使这些变量成为每个 .o 文件的本地变量,而不是让它们共享,并且放弃“静态”会导致多个定义。 另一种选择是创建一个静态类,如

class Params {
  public:
    static int WindowHeight;
    //...etc.
}

但是你必须在别处单独初始化参数:

int Params::WindowHeight = 600;

这是我非常想避免的。 我什至会接受以下内容(顺便说一句,这对我不起作用)

namespace Params {
    static int WindowHeight
#ifdef __MUST_INIT_PARAMS
    = 600
#endif
    ;
};

只要每个条目都可以保存在一个地方。

有什么想法吗?任何形式的帮助都会很棒! 谢谢!

【问题讨论】:

  • 作为整数类型的静态类成员(如上面的示例)可以内联初始化。 (例如静态 int WindowHeight = 600; )
  • 我认为这仅在某些编译器中是正确的,因为我的 gcc 抱怨。 error: ISO C++ forbids in-class initialization of non-const static member ‘var’ 我想它必须是一个常量,但这对我不起作用。
  • @StokedOver9k - 他的意思是“作为整数类型的静态 const 类成员”。
  • @Rob - 你当然是对的。你的心灵感应能力太棒了:-)

标签: c++ namespaces include


【解决方案1】:

如果所有参数都是编译时已知的整数,则可以使用enum

namespace Params {
  enum e {
    WindowHeight = 600,
    // etc.
  };
}

用法:

  InitWindow(Params::WindowHeight);

【讨论】:

  • 是的...但是有些参数可能不是整数,有些可能会改变。
【解决方案2】:

您第一次使用static 声明了一个特定于包含标题的每个翻译单元的变量。在一个类中,static 意味着一个全新的东西——它声明了一个类范围的变量。

要在命名空间内定义全局变量,您需要使用extern

//header.h
namespace Params {
    extern int WindowHeight;
};

//definition.cpp
namespace Params
{
    int WindowHeight = 600;
}

【讨论】:

  • 感谢您的快速回复。但是,这里的整个想法是将参数(定义和声明)全部保存在一个地方(一个文件)。这是可能的还是唯一的方法,标准的 .h + .cpp 组合?我对创建一个额外的 .o(或必须将默认值写入 main)不太感兴趣。
  • @StokedOver9k #define WindowHeight 600 会这样做,如果你不想声明它extern。并不是说你不必创建额外的.o,你只需要在cpp文件中定义WindowHeight,不管是哪个。
【解决方案3】:

你需要这样做:

//Params.h

namespace Params {
    extern int WindowHeight;  //it is declaration
};

然后在.cpp文件中:

//Params.cpp

 #include "Params.h" //not needed!

namespace Params {
    int WindowHeight = 600;  //it is definition
};

【讨论】:

    【解决方案4】:

    您需要使用extern 而不是static
    在 cpp 文件中定义一次。

    //文件名.h

    namespace Params 
    {
        extern int WindowHeight;
    };
    

    将其定义为 cpp 文件之一
    //Filename.cpp

    namespace Params 
    {
        int WindowHeight = 100;
    };
    

    【讨论】:

    • 在链接过程中我仍然得到多个定义。
    • @StokedOver9k:除非你展示你做了什么,否则很难说出原因。
    【解决方案5】:

    如上所述,您需要使用 extern 而不是 static。如果你想在同一个文件中声明和定义,如果你使用 extern,你最后一次尝试定义将起作用:

    namespace Params {
        extern int WindowHeight
    #ifdef __MUST_INIT_PARAMS
        = 600
    #endif
        ;
    };
    

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 2020-04-20
      • 2021-06-24
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2013-02-16
      • 2021-11-10
      • 2016-06-11
      相关资源
      最近更新 更多