我试图从构建服务器捕获环境变量,作为可在构建库中使用的编译时常量。我有一个静态类,可以查询这些常量,并希望constexpr
与std::getenv
一起使用,但我得到的错误是constexpr变量必须从常量表达式初始化,因为{ {1}}返回非const getenv
,因为它是a little long in the tooth。
如果可能的话,我希望通过将所有env变量注入char*
来避免使构建脚本膨胀。如果答案只是"不,你必须将每个添加为类似#34;的定义,并且没有-DMY_ENV_VAR
的现代替代品或我可以使用的技巧,所以就这样吧,但是保持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");