【发布时间】:2018-02-06 21:08:08
【问题描述】:
从this question 上的答案和cmets,我了解到getenv 是由C++ 标准定义的,但setenv 不是。确实,下面的程序
#include <cstdlib>
#include <iostream>
int main ( int argc, char **argv )
{
std::cout << std::getenv("PATH") << std::endl; // no errors
std::setenv("PATH", "/home/phydeaux/.local/bin:...", true); // error
}
无法为我编译(clang 3.9)。
为什么这些看似互补的功能之一被标准化,而另一个却没有?
【问题讨论】:
-
@tambre Doubtful,
std::getenv从 C++11 开始是线程安全的(根据 cppreference) -
推测,但我想说的是因为
std::getenv有一个相对简单的定义可以标准化。串入,串出。补充不是那么直接,并且非常依赖于实现。 -
C standard mirrors this。有7.22.4.6
getenv函数,但没有对应的setenv()。因此,无论从 C++ 中省略它的逻辑是否存在,它可能也适用于 C。因此我添加了 C 标记。 (还有语言律师标签……) -
我同意@StoryTeller 的推测,我想没有明确的答案,因此我投票以“主要基于意见”的方式结束,尽管这个问题确实很有趣......
-
我投票决定重新打开 - 并不是说它有很大的不同 - 因为事实证明有一份文件给出了省略一个非常相关的功能的理由。
标签: c++ c language-lawyer