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