如何在没有警告的情况下使用 execv()?

Posted

技术标签:

【中文标题】如何在没有警告的情况下使用 execv()?【英文标题】:How to use execv() without warnings? 【发布时间】:2012-05-28 21:44:06 【问题描述】:

我正在使用 GCC 4.2 开发 MacOS-X Lion。此代码有效,但我收到一条警告,我想修复:

#include <unistd.h>
main()

    char *args[] = "/bin/ls", "-r", "-t", "-l", (char *) 0 ;
    execv("/bin/ls", args);

警告:不推荐将字符串常量转换为 'char*'

我不希望警告被压制,我根本不想拥有它。 它是 C++ 代码,而不是 C。

使用 char *const(因此正是 execv() 所需的类型)仍然会产生警告。

谢谢。

【问题讨论】:

这给出一个错误,而不是一个警告。 【参考方案1】:

这似乎没问题:

#include <unistd.h>
main()

    char const *args[] = "/bin/ls", "-r", "-t", "-l", NULL ;
    execv("/bin/ls", const_cast<char**>(args));

【讨论】:

【参考方案2】:

您正在将字符串常量转换为可变字符指针,使用隐式转换进行更改,编译器警告您该语言的较新版本不允许这种转换。

当定义一个字符串时,C++ 将它理解为一个常量字符数组,你已经将它定义为一个可变字符数组,相应地更改你的代码。

【讨论】:

awiebe:“您正在转换字符串常量”。 char *args[] 不是常量。 @Pietro:不,但是您尝试使用 are 初始化它的每一个文字。【参考方案3】:

变化:

char *args[] = "/bin/ls", "-r", "-t", "-l", (char *) 0 ;

收件人:

char *const args[] = "/bin/ls", "-r", "-t", "-l", NULL ;

【讨论】:

我不断收到同样的警告。【参考方案4】:

您收到警告的唯一原因是您使用的是 g++,而不是 gcc。 在纯 C 中,您绝对不会收到任何警告。 从中创建无警告的 C++ 代码实际上非常困难。老实说,我尝试过但没有成功。

这些障碍是某个哲学流派存在的原因之一。查看更多here。

【讨论】:

在阅读了 Linus Torvalds 关于 C++ 的评论后,我想协助 Torvalds 和 Stroustrup 之间的比赛。我敢肯定会有很多血 :-) 就我而言,我永远不会从 std::vector 回到 malloc!【参考方案5】:

我不知道为什么选择接受的答案,当我运行此代码时它不会删除任何警告......

我无法在您的特定平台上进行确认,但是向每个字符串常量添加强制转换使警告对我来说消失了。

#include <unistd.h>
main()

    char* const args[] = (char*)"/bin/ls", (char*)"-r", (char*)"-t", (char*)"-l", (char*) 0 ;
    execv("/bin/ls", args);

#include <unistd.h>
main()

    char *args[] = (char*)"/bin/ls", (char*)"-r", (char*)"-t", (char*)"-l", (char*) 0 ;
    execv("/bin/ls", args);

它可能过于冗长和烦人,但警告消失了。

我正在运行它:g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

【讨论】:

重要的区别是char const* vs char * const!第一个是指向 constant char 的指针,第二个是指向 char 的 constant pointer。另见Constness【参考方案6】:

改变

char *args[] = "/bin/ls", "-r", "-t", "-l", (char *) 0 ;

char <em>args[] = (char</em>*)"/bin/ls", (char*)"-r", (char*)"-t", (char*)"-l", 0 ;

为了可用性,你可以做一个简单的转换方法。

【讨论】:

你的意思是我应该定义一个 8 位字符的数组并在其中放置 64 位指针?

以上是关于如何在没有警告的情况下使用 execv()?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 execv 生成后台程序

如何在一行中为 execv() 压缩没有父文件和根文件

如何在没有任何错误或警告的情况下找到构建失败的原因

做出反应。如何在没有警告的情况下将 Grid 插入 TabPanel?

如何在没有警告的情况下调用 QML Menu::addMenu?

EasyMock:如何在没有警告的情况下创建泛型类的模拟?