我试图在使用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函数呢?
答案 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);