当前位置:  开发笔记 > 编程语言 > 正文

在C++中访问环境变量

如何解决《在C++中访问环境变量》经验,为你挑选了4个好方法。

我想$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;                                                                        
}           

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



1> Matt Davis..:

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

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


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

2> 小智..:

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

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



3> Brian R. Bon..:

如果您使用的是Windows,则可以使用Win32 API GetEnvironmentVariable

在其他基于linux/unix的系统上使用getenv

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

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

而从MSDN GetEnvironment:

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


这意味着在进程启动后,使用SetEnvironmentVariable设置的环境变量无法访问genenv.
这是关于来自MSDN的getenv()的好奇评论.知道它的真正含义(即,这些差异可能是什么以及何时)?
听起来微软并没有费心去正确实现标准的`getenv()`函数.这可能不是一个准确的解释,但它是它的伤口.

4> Mykola Golub..:

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

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有