C++ C++;17新增了什么:错误C4996:';getenv';:此函数或变量可能不安全。考虑使用

C++ C++;17新增了什么:错误C4996:';getenv';:此函数或变量可能不安全。考虑使用,c++,cross-platform,visual-studio-2019,C++,Cross Platform,Visual Studio 2019,我尝试在Linux和windows中执行一个简单的任务并获取环境变量 所有文档都指向使用:std::getenv 但当我使用visual studio 2019在windows 10中运行编译时,我得到: error C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNIN

我尝试在Linux和windows中执行一个简单的任务并获取环境变量 所有文档都指向使用:std::getenv 但当我使用visual studio 2019在windows 10中运行编译时,我得到:

error C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS
这就是功能:

std::string Utils::getEnvVar(std::string const& key)
{
    char* val = std::getenv(key.c_str());
    return val == NULL ? std::string("") : std::string(val);
}

我只找到了这个,我不明白什么是跨平台解决方案。

编译器消息说明了一切:

错误C4996:“getenv”:此函数或变量可能不安全。请考虑使用要禁用弃用,请使用_CRT\u SECURE\u NO\u警告

警告是MSVC特有的。它警告使用不安全的C标准函数

如果您只需要在MSVC上编译,那么

考虑改用_dupenv_

如果您需要跨平台兼容性,那么

要禁用弃用,请使用_CRT\u SECURE\u NO\u警告

这是一个定义,所以只需定义CRT安全无警告即可。另一种解决方案是禁用警告(
#pragma warning(disable:4996)


另请参见。

如果您更一般地搜索错误消息,而没有明确指定
getenv
,那么您应该会得到更多关于“问题”和可能解决方案的信息。作为一种快速解决方法,错误消息本身包含关于如何禁用警告的提示。MS VS2019不喜欢一些旧的C调用、访问原始指针和缓冲区等。他们有一个观点:有可能错误地使用它,并在程序中创建后门,从而使它有可能被利用。所以你必须说服VS你真的想使用它。请参阅Windows上关于“为什么”的评论,使用。创建第三个函数,将Windows和Linux上的
getenv
包装成一个公共界面。但是std::getenv的实际问题是什么?我发现了另一个线程:@Bernd我不知道MS认为
getenv
的问题是什么。他们在手术室里没有提到。阅读可能他们想要更好的参数验证和增强的错误报告。或者,他们希望防止代码错误地写入
*getenv(…)
,返回
char*
,而不是
const char*
?@WernerHenze您可以看到“为什么”的注释。@AyxanHaqverdili From“\u dupenv\s使用全局变量\u environ指向的环境副本来访问环境。”因此,警告建议的替代方法与
getenv
相同。