在C++中访问环境变量

Jam*_*son 64 c++ environment-variables

我想$HOME在我正在编写的C++程序中访问环境变量.如果我用C编写代码,我只是使用该getenv()函数,但我想知道是否有更好的方法来实现它.这是我到目前为止的代码:

std::string get_env_var( std::string const & key ) {                                 
    char * val;                                                                        
    val = getenv( key.c_str() );                                                       
    std::string retval = "";                                                           
    if (val != NULL) {                                                                 
        retval = val;                                                                    
    }                                                                                  
    return retval;                                                                        
}           
Run Code Online (Sandbox Code Playgroud)

我应该用getenv()C++访问环境变量吗?是否有任何我可能遇到的问题,我可以通过一点点知识来避免?

Mat*_*vis 62

getenv()在C++中使用没有任何问题.它由stdlib.h,或者如果您更喜欢标准库实现,您可以cstdlib通过std::命名空间包含和访问该函数(即,std::getenv()).这绝对没有错.实际上,如果您担心可移植性,则首选这两个版本中的任何一个.

如果您关心可移植性并且使用托管C++,则可以使用.NET等效项 - System::Environment::GetEnvironmentVariable().如果你想要Windows的非.NET等价物,你可以简单地使用GetEnvironmentVariable()Win32功能.

  • @shbk,在<stdlib.h>中定义了一个getenv()函数,它在全局命名空间中,就是你所指的那个.在<cddlib>中定义的getenv()函数位于std命名空间中. (9认同)
  • 为清楚起见,`getenv()`在创建进程时访问环境变量的快照.如果环境变量在进程的生命周期内发生变化,`getenv()`将不会看到这些变化.如果这是一个问题,请使用`GetEnvironmentVariable()`. (2认同)

小智 26

我只想稍微重构一下代码:

std::string getEnvVar( std::string const & key ) const
{
    char * val = getenv( key.c_str() );
    return val == NULL ? std::string("") : std::string(val);
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的解决方案。简洁明了! (2认同)

Bri*_*ndy 18

为什么在Windows中使用GetEnvironmentVariable,来自MSDN getenv:

getenv仅对运行时库可访问的数据结构进行操作,而不对操作系统为进程创建的环境"段"进行操作.因此,对main或wmain使用envp参数的程序可能会检索无效信息.

从MSDN GetEnvironment:

此函数可以检索系统环境变量或用户环境变量.

  • 这意味着在进程启动后,使用SetEnvironmentVariable设置的环境变量无法访问genenv. (5认同)
  • 这是关于来自MSDN的getenv()的好奇评论.知道它的真正含义(即,这些差异可能是什么以及何时)? (2认同)
  • 听起来微软并没有费心去正确实现标准的`getenv()`函数.这可能不是一个准确的解释,但它是它的伤口. (2认同)
  • Microsoft 的 [getenv](http://msdn.microsoft.com/en-us/library/tehxacec.aspx) 或多或少是全局 [_environ](https://msdn.microsoft.com/en- us/library/stxk41x1.aspx) 变量。该变量在进程启动时初始化。如果进程通过 Windows API 更新其环境(例如,通过调用 [SetEnvironmentVariable](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686206.aspx)),则这不会反映在CRT `_environ` 变量。真实环境存储在进程环境块 (PEB) 中,只能通过 Windows API 访问。 (2认同)

Myk*_*yev 10

在c ++中你必须使用std :: getenv和 #include <cstdlib>