在 C++ 中正确设置局部环境变量

Proper setting a local environment variable in C++

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

putenv("TZ=UTC");
tzset();

设置时区。

putenv()声明(this answer推荐设置环境变量):

int putenv(char *string);

我正在使用的构建系统设置了编译器标志 -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");
                  ^

我知道这个错误可以通过使用来抑制:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wwrite-strings"
  putenv("TZ=UTC");
#pragma GCC diagnostic pop

但这很丑

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

string literalconst,它的类型是 const char[](对于 "TZ=UTC" 它将是 const char[7],包括尾随的空字符 '[= 15=]'),它不能直接分配给 C++11 中的(非常量)char*

您可以为它构造一个新的 char 数组。

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

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

所以这是 const cast:

的罕见正确用例之一
putenv(const_cast<char *>("TZ=UTC"));

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

setenv("TZ", "UTC", 1);