C ++的putenv警告

时间:2019-01-20 18:13:11

标签: c++ c environment-variables

我试图在使用putenv编译的程序中使用stdlib g++函数,包括标志和警告-std=c++11-Wall -Wextra。 / p>

该程序可以像下面这样简单:

#include<stdlib.h>
#include<iostream>
int main(int argc, char *argv[])
{
    putenv("LD_LIBRARY_PATH=../Desktop/lib");
    std::cout<<"hello\n";
    return 0;

}

但是我收到此错误warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

据我在C ++中的理解,我应该声明:char const *str =,但随后putenv在抱怨。

我知道我可以转换,但是有没有适当的方法在C ++中使用putenv函数,还是应该完全避免使用C函数呢?

4 个答案:

答案 0 :(得分:4)

虽然std::getenv是C ++标准的一部分(也是C标准的一部分,但将来会选择 一种 语言,这是您真正编程的语言) (如果您使用的是C ++),则putenv函数不是。

从链接的putenv的POSIX参考中可以看到,它的参数的类型为char *

这非常重要,C和C ++之间有一点不同:在C中,可以将文字字符串传递给期望char *的函数。在C ++中,所有文字字符串都是 恒定 ,并且只能传递给期望const char *的函数。

要解决您的问题,您需要使用初始化的非常数数组,然后传递:

char env[] = "LD_LIBRARY_PATH=../Desktop/lib";
putenv(env);

重要说明:该数组在程序的整个生命周期内必须有效。这意味着即使在main函数返回之后。

更好的解决方案(并在注释中提到)是setenv函数,该函数都将const char *作为其自变量(因此可以与文字字符串一起使用),并且还复制了这意味着范围和寿命没有问题。


关于字符串文字。在C和C ++中,它们实际上都是字符数组。区别在于,在C ++中,数组是恒定的。

答案 1 :(得分:2)

该问题已经由其他答案指出。在C++中,字符串文字的类型为const char[],而在C语言中,字符串文字的类型为char[],但是对其进行修改将导致未定义的行为。

根据man页:

  

putenv()函数添加或更改环境的值          变量。参数字符串的形式为name = value。如果名字          在环境中尚不存在,则将字符串添加到          环境。如果名称确实存在,则名称在          环境变成了价值。字符串指向的字符串          成为环境的一部分,因此更改字符串会更改          环境。

     

...

     

因此,使用以下命令调用putenv()是一个错误          自动变量作为参数,然后从调用中返回          函数,而字符串仍然是环境的一部分。

当您使用自动存储的变量调用putenv时(例如,如果您在main以外的函数中调用它),请注意,因为指针已成为环境的一部分。

答案 2 :(得分:2)

另一种选择是遵循the putenv manpage的建议,您应该使用更现代,更安全的setenv,它不存在此问题,也不存在由此而引起的任何复杂性。 / p>

答案 3 :(得分:1)

putenv 得到一个(非常量)char *,而您给出一个const char *,编译器对此并不满意,这是正常的

只要做

char s[] = "LD_LIBRARY_PATH =../Desktop/lib";

putenv(s);