C11 在标准库中添加了新的边界检查函数,例如getenv_s
。
但是,当我包含时<cstdlib>
,我没有std::getenv_s
,只有getenv_s
(全局命名空间)。
cppreference 有以下注释:
__STDC_LIB_EXT1__
与所有边界检查函数一样,只有在实现中定义并且用户__STDC_WANT_LIB_EXT1__
在包含 <stdlib.h> 之前将其定义为整数常量 1 时,才保证 getenv_s 可用。
即使我定义__STDC_WANT_LIB_EXT1__
为1
,我的编译器(MSVC C++23)也找不到该std::getenv_s
函数。
难道不<cstdlib>
应该将每个符号都带入命名<stdlib.h>
空间吗std
?
后缀函数
_s
是 C 标准中可选附件 K 的一部分。由于它们是可选的,因此可能并非所有实现都支持它们。在 C++ 中,包含 C++ 头文件是否会将这些函数包含在全局命名空间范围内是由实现定义的,但它们永远不会在
std
命名空间范围内可用。它们不像非可选的 C 标准库函数那样完全纳入 C++ 标准库。参见[headers]/10。
还要注意,如果他们还没有修复这个问题,那么 MSVC 对这些
_s
函数的实现会早于标准中的函数实现,有时会偏离标准的规范。例如,请参阅https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm。