O C11 adicionou novas funções de verificação de limites à biblioteca padrão, como getenv_s
.
Porém, quando incluo <cstdlib>
, não tenho std::getenv_s
, apenas getenv_s
(namespace global).
cppreference tem a seguinte nota:
Assim como todas as funções com verificação de limites, getenv_s só tem garantia de estar disponível se
__STDC_LIB_EXT1__
for definido pela implementação e se o usuário definir__STDC_WANT_LIB_EXT1__
a constante inteira 1 antes de incluir <stdlib.h>.
Mesmo quando defino __STDC_WANT_LIB_EXT1__
como 1
, meu compilador (MSVC C++23) não encontra a std::getenv_s
função.
Não <cstdlib>
deveria trazer todos os símbolos de <stdlib.h>
para o std
namespace?
As
_s
funções de sufixo são parte do Anexo K opcional nos padrões C. Por serem opcionais, elas podem não ser suportadas por todas as implementações.Em C++, é definido pela implementação se incluir um cabeçalho C++ incluirá essas funções no escopo global do namespace, mas elas nunca são disponibilizadas no
std
escopo do namespace. Elas não são totalmente incorporadas à biblioteca padrão C++ como as funções não opcionais da biblioteca padrão C.Veja [cabeçalhos]/10 .
Também esteja ciente de que, se eles não consertarem isso nesse meio tempo, a implementação MSVC das
_s
funções é anterior àquelas no padrão e às vezes desvia da especificação do padrão. Veja, por exemplo, https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm .