我正在尝试使用putenv
stdlib
我正在编译的程序中的函数g++
包括标志和警告-std=c++11
and -Wall -Wextra
.
该程序可以简单如下:
#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
正在抱怨。
我知道我可以投射,但是有正确的使用方法吗putenv
C++ 中的函数还是 C 函数,应该完全避免?
While std::getenv https://en.cppreference.com/w/cpp/utility/program/getenv是 C++ 标准的一部分(也是 C 标准的一部分,但将来会选择one语言,你真正编程的语言,在你的例子中是 C++),putenv http://pubs.opengroup.org/onlinepubs/9699919799/functions/putenv.html函数不是。
正如您从链接的 POSIX 参考中看到的putenv http://pubs.opengroup.org/onlinepubs/9699919799/functions/putenv.html,它的参数是类型char *
.
这非常重要,也是 C 和 C++ 之间的一个不同之处:在 C 中,可以将文字字符串传递给期望的函数char *
。在 C++ 中,所有文字字符串都是constant并且只能传递给期望的函数const char *
.
要解决您的问题,您需要使用初始化然后传递的非常量数组:
char env[] = "LD_LIBRARY_PATH=../Desktop/lib";
putenv(env);
重要提示:该数组必须在程序的整个生命周期内有效。这意味着即使在main
函数返回。
更好的解决方案(并在评论中提到)是setenv http://pubs.opengroup.org/onlinepubs/9699919799/functions/setenv.html函数,两者都取const char *
为其参数(因此可以与文字字符串一起使用)并且还复制参数,这意味着范围和生命周期没有问题。
关于字符串文字。在 C 和 C++ 中,它们实际上都是字符数组。不同之处在于 C++ 中的数组是常量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)