标准是否保证std::getenv()
和std::setenv()
具有与cout
相同的访问保护?标准允许在main返回后在静态对象的析构函数(和构造函数)中访问
静态对象的构造函数和析构函数可以访问这些对象,从stdin
读取输入或将输出写入stdout
或stderr
。
从阅读似乎会从std::setenv()
调用的代码来看,它似乎是在一个全局变量上操作的(根据https://github.com/digitalocean/gnulib/blob/master/lib/setenv.c#L113)。所以好奇的是,是否需要使用与cout
,cin
和cerr
相同的技巧来使它们在关机时可访问。
1条答案
按热度按时间smdncfj31#
cout
及其同类在C++中是命名空间范围内的对象。因此,当main
退出时,它们将被销毁。它们将按照相对于其他全局对象的销毁顺序被销毁,而这些全局对象是您完全无法控制的。因此,为了确保您可以在静态对象构造函数/析构函数调用期间与这些对象交互,标准要求实现确保这些对象保持有效和未销毁。这条语句是 * 必需的 *,否则在静态对象构造函数/析构函数调用期间不可能安全地访问这些对象。
相反,
getenv
是一个 * 函数 *,而不是一个对象。它不能被摧毁。函数的行为完全且仅由其行为的标准定义确定,并且该行为必须“总是”发生。因此,除非这些函数被标准声明为在静态对象构造/析构的范围内调用时具有不同的行为,否则它们将继续在这些情况下做它们所说的事情。