【问题标题】:How to use execv() without warnings?如何在没有警告的情况下使用 execv()?
【发布时间】:2021-11-22 12:56:38
【问题描述】:

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

谢谢。

【问题讨论】:

  • 这给出一个错误,而不是一个警告。

标签: c++ macos g++ warnings 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 位指针?
    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2017-10-29
    • 2019-05-14
    • 2011-05-23
    • 1970-01-01
    • 2013-12-22
    相关资源
    最近更新 更多