C++ 的 putenv 警告

2024-03-30

我正在尝试使用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正在抱怨。

我知道我可以投射,但是有正确的使用方法吗putenvC++ 中的函数还是 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(使用前将#替换为@)

C++ 的 putenv 警告 的相关文章

随机推荐