【问题标题】:Using constexpr together with getenv (or alternative)将 constexpr 与 getenv (或替代方法)一起使用
【发布时间】:2016-06-30 14:08:54
【问题描述】:

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

如果可能的话,我想通过将所有环境变量注入为-DMY_ENV_VAR 来避免构建脚本臃肿。如果答案只是“不,您必须将每个都添加为这样的定义”,并且没有现代替代品 getenv 或我可以使用的技巧,那就这样吧,但是有两个地方需要维护,即不理想。

【问题讨论】:

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


    【解决方案1】:

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

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

    编译时常量是在编译时固定的东西。您的运行时环境在编译时不是固定的。所以getenv 的返回值不能constexpr

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

    【讨论】:

    • 啊哈 - 我正在使用 CMake 构建系统,我已经在其中对资产进行了类似的操作。生成标题是一个不错的选择
    【解决方案2】:

    我认为 std::getenv 不能用作 constexpr,因为它是运行时系统调用。您所说的“将有 2 个位置需要维护”是什么意思?您的静态类将只使用传递给构建的定义,即

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

    然后在 .cpp 文件中

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

    【讨论】:

    • 是的 - 但是从目标机器获取环境变量而不是编译时的构建服务
    • @learnvst - 不,它应该从构建机器中获取它。在上面的示例中,您没有在代码中调用 getenv,您只是指的是在构建时设置的定义。因此,您的构建命令行可能如下所示:gcc -DMY_ENV_VAR=$MY_ENV_VAR,它应该从构建机器中获取环境变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2019-06-29
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多