C11 在标准库中添加了新的边界检查函数,例如 getenv_s。 但是,当我包含
<cstdlib>
时,我没有 std::getenv_s
,只有 getenv_s
(全局命名空间)。
cppreference 有以下注释:
与所有边界检查函数一样,getenv_s 只能保证 如果
是可用的,则由实现定义并且 如果用户将__STDC_LIB_EXT1__
定义为整数常量 1 在包括__STDC_WANT_LIB_EXT1__
. 之前
即使我将
__STDC_WANT_LIB_EXT1__
定义为 1
,我的编译器 (MSVC C++23) 也找不到函数 std::getenv_s。
cstdlib
不是应该将stdlib.h
的每个符号带入std::
命名空间吗?
这些函数是 C 的一部分,但不是 C++ 的一部分,因此它们不出现在
std
命名空间中是有道理的(无论您如何包含它们)。从技术上讲,甚至全局 getenv_s
名称也不是 C++ 的一部分。
此外,它们在 C 中只是可选的,并非所有实现都支持它们。