在C++中正确设置本地环境变量

lew*_*tan 5 c++ string environment-variables string-literals c++11

在我的代码中,我使用以下内容:

putenv("TZ=UTC");
tzset();
Run Code Online (Sandbox Code Playgroud)

设置时区.

声明putenv()(这个答案建议它设置环境变量):

int putenv(char *string);
Run Code Online (Sandbox Code Playgroud)

我正在使用的构建系统设置编译器标志-Wall -Wextra -Werror -std=c++0x,因为我得到错误:

timeGateway.cpp:80:18: error: ISO C++ forbids converting a string constant to 'char*' [-Werror=write-strings]
   putenv("TZ=UTC");
                  ^
Run Code Online (Sandbox Code Playgroud)

我知道可以通过使用以下方法来抑制此错误:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wwrite-strings"
  putenv("TZ=UTC");
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

但这非常难看.

我的问题:在C++中设置环境变量的正确方法是什么?

son*_*yao 8

字符串文字const,其类型const char[](对于"TZ=UTC"这将是const char[7],包括尾随空字符'\0'),它不能被直接分配给一个(非const)char*从C++ 11.

你可以char为它构造一个新的数组.

char str[] = "TZ=UTC"; // initialize a char array, which will contain a copy of the string "TZ=UTC"
putenv(str);
Run Code Online (Sandbox Code Playgroud)


Ser*_*sta 4

putenv通常允许在调用 putenv 后更改字符串,这实际上会自动更改环境。char *这就是原型声明 a而不是 a的原因const char *,但系统不会更改传递的字符串。

所以这是罕见的正确用例之一const cast

putenv(const_cast<char *>("TZ=UTC"));
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用setenv带有const char *参数的:

setenv("TZ", "UTC", 1);
Run Code Online (Sandbox Code Playgroud)