【问题标题】:C++ Standard Library - std::setenv vs setenvC++ 标准库 - std::setenv 与 setenv
【发布时间】:2015-05-17 22:05:13
【问题描述】:

我有一个对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,为什么会这样?

【问题讨论】:

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


    【解决方案1】:

    我在cppr 上没有find 任何类似std::setenv 的东西,只有std::getenv 在其文档中引用了POSIX 函数setenv,当然这在@987654329 中不是 @。

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

    标准爱好者:setenv 仅提及

    调用函数 getenv 不应引入数据竞争 (17.6.5.9) 环境。 [ 注意:调用 POSIX 函数 setenvputenv 会修改环境。 - 结尾 注意]

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

    【讨论】:

    • C++ 标准没有定义setenv,所以如果实现将其定义为扩展,他们可以使用全局命名空间、std 命名空间或任何其他命名空间,但是他们看到合身。在 std 命名空间中声明它的 OP 实现与没有声明它的 OP 的其他实现一样有效。 (澄清一下:我同意普通的setenv 是OP 应该使用的,但是你的回答好像std::setenv 工作的事实是一个错误。)
    • @hvd 但缺乏进一步的文档(我不知道也找不到任何 setenv 除了 POSIX 的),我假设他在谈论 POSIX 并且想知道它是否也是标准 C++ 函数。由于 POSIX 函数不在namespace std 中,全局调用将是访问它的一般方法。虽然某些平台(如 linux 上的 gcc 显然将其添加到 namespace std),但定义它的标准却没有。我错了吗?
    • @hvd 另请注意,我从未说过 std::setenv 不允许工作,只是不能保证。
    • POSIX 将setenv 定义为全局函数并没有错,但这主要是因为POSIX 标准没有定义与C++ 的交互,只定义与C 的交互,而C 没有命名空间。过去曾有过关于 POSIX C++ 绑定的工作,但据我所知,它没有产生任何有用的东西,实现需要自己弄清楚如何最好地为 C++ 程序提供 POSIX 函数。
    • @hvd 好的,我已尽我所知澄清了。如果它仍然是错误的或不是最佳 IYO,请随时编辑或评论或回答自己或...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2011-12-01
    • 1970-01-01
    • 2018-02-06
    • 2012-07-15
    • 2016-05-30
    • 2020-01-03
    相关资源
    最近更新 更多