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

Proper setting a local environment variable in C++

本文关键字:设置局 环境变量 c++      更新时间:2023-10-16

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

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

设置时区。

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

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++中设置环境变量的正确方法是什么?

字符串文字是const,它的类型是const char[](对于"TZ=UTC",它将是const char[7],包括末尾的空字符''),它不能直接赋值给c++ 11中的(非const) 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);