【问题标题】:Proper setting a local environment variable in C++在 C++ 中正确设置本地环境变量
【发布时间】:2016-08-17 09:50:06
【问题描述】:

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

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

【问题讨论】:

  • 仔细阅读putenv的手册页,里面有一些重要的东西!

标签: c++ string c++11 environment-variables string-literals


【解决方案1】:

string literal 是const,它的类型是const char[](对于"TZ=UTC",它将是const char[7],包括结尾的空字符'\0'),不能直接分配给(非常量)char* 来自 C++11。

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

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

【讨论】:

  • 删除了我明显错误的答案(我很抱歉)。如果@songyuanyao的答案有效,请标记为答案。
【解决方案2】:

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

所以这是const cast 的少数正确用例之一:

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

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

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

【讨论】:

  • 这是const_cast 存在的主要示例(只要您绝对知道它不会尝试修改值,就可以解决糟糕的 API)和 IMO提供比需要中间非const 变量更好/更直接的解决方案。 +1
  • “这就是原型声明char *而不是const char *的原因”。这对我来说没有意义,putenv() 仍然可以将const char* 声明为参数的类型,如果它不会修改它,因为char* 可以隐式转换为const char*,不会给客户端代码。
  • @songyuanyao:为了以后可以正确处理更改,必须将参数强制转换为char *。如果不是,编译器可以缓存第一个读取值。
  • @SergeBallesta Cast,你的意思是putenv,还是客户端代码?在客户端代码中,如果希望稍后更改字符串,则应首先使用 char 数组(并传递给putenv)。
  • @songyuanyao:我的意思是在putenv 代码中或更准确地说是在environment 管理代码中,putenv 只是一个接口。在那个管理部分,参数确实是char *
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2011-03-25
  • 2021-08-29
  • 2018-07-30
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多