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

时间:2012-05-28 21:44:07

标签: c++ macos g++ warnings execv

我正在使用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()所需的类型)仍会产生警告。

谢谢。

6 个答案:

答案 0 :(得分:3)

这似乎没问题:

#include <unistd.h>
main()
{
    char const *args[] = {"/bin/ls", "-r", "-t", "-l", NULL };
    execv("/bin/ls", const_cast<char**>(args));
}

答案 1 :(得分:1)

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

当定义字符串时,c ++将其理解为一个常量字符数组,并将其定义为可变字符数组,相应地更改代码。

答案 2 :(得分:1)

变化:

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

要:

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

答案 3 :(得分:1)

你得到警告的唯一原因是你使用的是g ++,而不是gcc。 在纯C中,你绝对没有警告。 实际上很难从中创建无警告的C ++代码。说实话,我试过但没有成功。

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

答案 4 :(得分:1)

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

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

=SUMPRODUCT(($F$2:$K$9<>"")*($F$1:$K$1=$B$1)*($E$2:$E$9=$A2))

OR

#include <unistd.h>
main()
{
    char* const 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

答案 5 :(得分:0)

变化

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

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

对于可用性你可能会做一个简单的转换方法。