如何在C++中读取Linux环境变量

36

我想在我的C++程序中将一些环境变量从shell加载到字符串中,应该如何操作?

3个回答

45

使用getenv()函数 - 参见http://en.cppreference.com/w/cpp/utility/program/getenv。我喜欢将其封装如下:

std::string GetEnv( const std::string & var ) {
     const char * val = std::getenv( var.c_str() );
     if ( val == nullptr ) { // invalid to assign nullptr to std::string
         return "";
     }
     else {
         return val;
     }
}

这样做可以避免环境变量不存在的问题,并且让我能够轻松地使用C++字符串来查询环境。当然,它不能让我测试环境变量是否存在,但通常在我的代码中这不是一个问题。


1
有时候你可能想要区分“未设置”和“空”的区别。 - sehe
1
必须基于CharT创建模板,这需要使用SFINAE。哦,好吧,+1。 - Billy ONeal
1
你可以使用 boost::optional<std::string> 作为返回类型来区分缺失和空值。 - Matthieu M.
5
@Matthieu,我会说99%的时间我不关心环境变量是否真的存在——我只想知道它的值,并且如果它不存在,我会接受一个空字符串。与其将boost牵扯进来使问题复杂化,我会直接调用getenv()来测试它是否存在,或者可能编写一个EnvVarExists()函数。 - user2100815
2
我更多考虑的是您可能希望有一个合理的默认值的情况,但这可以通过提供具有第二个参数的重载来实现 :) - Matthieu M.

9
与C语言相同:使用getenv(variablename)。

4
您可以简单地使用 char* env[]。
int main(int argc, char* argv[], char* env[]){
    int i;
    for(i=0;env[i]!=NULL;i++)
    printf("%s\n",env[i]);
    return 0;
}

这里是一篇关于你的问题的完整文章,来自我的网站


1
感谢您发布的答案!请务必仔细阅读有关自我推广的常见问题解答。同时请注意,每次链接到自己的网站/产品时都必须发布免责声明。 - Andrew Barber
2
这里应该是“function”,而不是“fonction”(指你的网站)。另外,main() 的第三个参数是非标准的,在所有平台/编译器上都不能保证可用。 - DevSolar
这个能够处理程序启动后导出/设置的环境变量吗? - nurettin
nurettin:我认为是这样,但最好确定一下 ;) - hanoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接