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

标签 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,为什么会这样?

最佳答案

我没有find任何类似 std::setenvcppr , 只有 std::getenv在其文档中引用了 POSIX 函数 setenv ,当然namespace std 中。

因此,由于您没有调用 C++ 标准函数,因此应该采用普通 setenv 方法,因为这是定义函数的标准定义它的方式。请注意,std::setenv 允许(但不是必需)工作。 (另见 hvd's comment。)

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

Calls to the function getenv shall not introduce a data race (17.6.5.9) provided that nothing modifies the environment. [ Note: Calls to the POSIX functions setenv and putenv modify the environment. — end note ]

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

关于C++ 标准库 - std::setenv 与 setenv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30292642/

相关文章:

c++ - 如何在 OSX 中获取程序的最大内存使用量

java - jstring/c++ 的 Ljava/lang/String 错误

c++ - C++ 中的字符串标记化,包括定界符

c++ - 如何将对象 move 到未初始化的内存中?

c - 调用 exec 家族时是否替换、复制或共享环境变量?

c++ - 模板函数..错误 : template-id does not match any template declaration

C++ 右值引用请求

c++ - 通过模板化引用传递 C++11 lambda

java - Mac 环境变量不可用于 java 运行时类

javascript - 安装 npm-check -g,得到 bash : npm-check: command not found when running it