在C ++中存储常量

时间:2013-03-03 12:33:14

标签: c++ string global-variables const

我想将程序的目录结构存储为常量字符串的结构,但C ++不允许我以任何直观的方式进行操作。

所以这不起作用:

struct DirStructure {
    static const std::string entities = "./entities";
    static const std::string scripts = "./scripts";
}

这两个都没有:

struct DirStructure {
    static const std::string entities() const = { return "./entities"; }
    static const std::string scripts() const { return "./scripts"; }
}

(实际上没有const,但我不太喜欢它。)

这有效:

namespace DirStructure {
    static const std::string entities = "./entities";
    static const std::string scripts = "./scripts";
}

但它有一些其他问题。

处理这样一个问题的标准方法是什么(假设我宁愿避免#define MY_SCRIPTS_DIR_PATH "./scripts")?

3 个答案:

答案 0 :(得分:3)

我想到了三种方法。前两个类似于你的方法,后者更像是我可能使用的方法

#1 - 匿名命名空间+内联constexpr函数

为了我的目的,这解决了除1个问题之外的所有问题:

#include <string>

namespace DirStructure {
    namespace {
        inline constexpr char const* const entities() { return "./entities"; }
    }
};

int main()
{
    std::string e = DirStructure::entities();
}

剩下的一个问题是字符串文字不能包含嵌入的NUL字符(在文件路径的情况下这不是问题)。

#2 - 聚合初始化

另一种方法可能是

#include <string>

struct DirStructure
{
    std::string entities, scripts;
};

inline static const DirStructure& Config()
{
    static DirStructure _s = { "./entities", "./scripts" };
    return _s;
}

int main()
{
    std::string e = Config().entities;
}

#3 - 表达类型

通常我实际上 使用 的内容类似于:

#include <string>
#include <map>
#include <boost/filesystem.hpp>

int main()
{
    const std::map<std::string, boost::filesystem::path> DirStructure = { 
        { "entities", "./entities" },  
        { "scripts", "./scripts" } 
    };
    auto const& e = DirStructure.at("entities");
}

答案 1 :(得分:2)

您的第一个版本应该可以正常工作,只需稍作调整即可。您应该从您的定义中拆分您的声明。

# Declaration in dirstructure.h
struct DirStructure {
    static const std::string entities;
    static const std::string scripts;
}

# Definition in dirstructure.cpp
const std::string DirStructure::entities("./entities");
const std::string DirStructure::scripts("./scripts");

答案 2 :(得分:1)

  

source.cpp:4:54:错误:静态数据成员的类内初始化   'const string DirStructure :: entities'非文字类型

     

source.cpp:4:54:错误:非常量的类内初始化无效   对于静态成员'DirStructure :: entities'

     

source.cpp:4:54:错误:(一个   需要进行类外初始化)

g++告诉您需要进行类外初始化,因此:

struct DirStructure {
    static const std::string entities;
    static const std::string scripts;
}

const std::string DirStructure::entities = "blah";
const std::string DirStructure::scripts = "blah2";

的工作原理。但我也更喜欢命名空间。