使用constexpr和getenv(或替代)

时间:2016-06-30 14:08:54

标签: c++ c++11 environment-variables constexpr

我试图从构建服务器捕获环境变量,作为可在构建库中使用的编译时常量。我有一个静态类,可以查询这些常量,并希望constexprstd::getenv一起使用,但我得到的错误是constexpr变量必须从常量表达式初始化,因为{ {1}}返回非const getenv,因为它是a little long in the tooth

如果可能的话,我希望通过将所有env变量注入char*来避免使构建脚本膨胀。如果答案只是"不,你必须将每个添加为类似#34;的定义,并且没有-DMY_ENV_VAR的现代替代品或我可以使用的技巧,所以就这样吧,但是保持2个点,这是不理想的。

2 个答案:

答案 0 :(得分:2)

getenv与之交互的C ++程序的运行时环境基本上不是编译时常量。

您指出的char* vs const char*问题与此问题无关。

编译时常量是在编译时修复的东西。您的运行时环境在编译时未得到修复。因此getenv的返回值不能constexpr

您可以创建脚本来编写包含要存储在constexpr存储中的构建时环境变量的标头,而不是一堆-D命令。

答案 1 :(得分:0)

我不认为std :: getenv可以用作constexpr,因为它是一个运行时系统调用。你是什​​么意思"有2个点可以维持"?你的静态类只会使用传递给build的定义,即

class CBuildConsts
{
    public:
    static const std::string Thing;
}

然后在.cpp文件中

const std::string CBuildConsts::Thing = std::string("MY_ENV_VAR");