4

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

谢谢你。

4

6 回答 6

4

这似乎没问题:

#include <unistd.h>
main()
{
    char const *args[] = {"/bin/ls", "-r", "-t", "-l", NULL };
    execv("/bin/ls", const_cast<char**>(args));
}
于 2012-06-09T14:45:13.437 回答
1

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

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

于 2012-05-28T21:59:34.913 回答
1

改变:

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

到:

char *const args[] = {"/bin/ls", "-r", "-t", "-l", NULL };
于 2012-05-28T23:16:07.927 回答
1

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

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

于 2013-09-05T06:53:10.977 回答
1

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

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

#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

于 2016-02-15T16:10:52.080 回答
0

改变

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

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

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

于 2013-04-04T21:55:55.847 回答