C ++标准库 - std :: setenv vs setenv

时间:2015-05-17 22:05:13

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

我有一个简单的std::setenv调用,它在gcc下的Linux发行版上运行正常。但是,在我的Mac OS X上使用clang时,我收到以下错误。

error: no member named 'setenv' in namespace 'std'; did you mean simply 'setenv'?
std::setenv(name.c_str(), value.c_str(), true);

我确定,我已经在某个地方读到setenv是C ++ 11中命名空间std的一部分,但现在我不确定。

问题:应该使用setenv还是std::setenv,为什么会出现这种情况?

1 个答案:

答案 0 :(得分:12)

find std::setenv上没有cpprstd::getenv只有setenv,其文档中引用了POSIX函数hvd's comment,当然这是< namespace std中的em> not 。

因为你没有调用C ++标准函数,所以普通setenv应该是要走的路,因为这是定义函数的标准定义它的方式。请注意,std::setenv允许(但不是必需)工作。 (另见Getting the user id from logged in user in FOSUserBundle。)

对于标准爱好者:setenv仅作为

提及
  

对函数getenv的调用不应引入数据竞争(17.6.5.9),前提是没有任何修改   环境。 [注意:调用POSIX函数setenvputenv会修改环境。 - 结束   注意]

来自N3797 18.10.5。它确实不是C ++标准函数,因此不一定在namespace std中。