在 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 literal 是 const
,它的类型是 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);
在我的代码中,我使用了以下内容:
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 literal 是 const
,它的类型是 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);