2016-08-17 21 views
4

本地环境变量在我的代码:正确的设置,我用下面的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++中设置环境变量的正确方法?

+0

阅读['运行putenv的手册页'](http://linux.die.net/man/3/putenv)小心,它有一些重要的东西! – hyde

回答

3

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

所以这是一个const cast罕见的正确使用情况之一:

putenv(const_cast<char *>("TZ=UTC")); 

或者,你可以使用setenv这需要const char *参数:

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

这是为什么'const_cast'存在的一个主要例子(只要你绝对知道它不会尝试修改该值,就可以解决糟糕的API),IMO提出更好/更直接的解决方案,而不是需要中间非'const '变量。 +1 –

+0

“这就是为什么原型声明'char *'而不是'const char *'”的原因。这对我没有意义,'putenv()'仍然可以声明'const char *'作为参数的类型,如果它不会修改的话,因为'char *'可以被隐式转换为'const char *',客户代码不会遇到麻烦。 – songyuanyao

+0

@songyuanyao:为了以后允许更改被正确处理,参数必须在某处转换为char *。如果不是,编译器可以缓存第一个读取值。 –

8

string literalconst,其类型是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); 
+0

谢谢。这工作。 – lewiatan

+0

删除了我明显错误的答案(我的道歉)。如果@songyuanyao的答案有效,请将其标记为答案。 –

相关问题