execvp的正确数组类型

时间:2017-07-06 16:16:40

标签: c++ arrays types exec

我很难弄清楚如何在C ++中使用execvp。我没有任何问题让我的代码工作,但我特别试图找出如何以一种不会让编译器抱怨的方式来实现它。

我已经查看了有关Stack Overflow和其他资源的各种问题,但我一直无法找到导致编译器出现零警告的解决方案。

考虑以下C ++程序,它打印自己的源代码:

#include <unistd.h>

int main(int argc, char *argv[])
{
    char *args[3];
    args[0] = "/bin/cat";
    args[1] = __FILE__;
    args[2] = NULL;

    execvp(args[0], args);

    return 0;
}

(我知道永远不应该达到return 0;我并不关心这个问题中的错误处理。)

编译时,编译器会发出两个警告:

 $ g++ -Wall exec.cpp
exec.cpp: In function ‘int main(int, char**)’:
exec.cpp:6:15: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
     args[0] = "/bin/cat";
               ^~~~~~~~~~
exec.cpp:7:15: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
     args[1] = __FILE__;
               ^~~~~~~~

已编译的程序成功打印源文件。但是,我真的很想让程序在没有任何警告的情况下编译。由于编译器并不喜欢将字符串文字分配给类型char*(而不是const char*)的指针,我认为将args标记为const char*指针数组。考虑这个版本的程序:

#include <unistd.h>

int main(int argc, char *argv[])
{
    const char *args[3];
    args[0] = "/bin/cat";
    args[1] = __FILE__;
    args[2] = NULL;

    execvp(args[0], args);

    return 0;
}

我认为这个程序应该在没有警告或错误的情况下编译和运行,但编译器会发出错误:

 $ g++ -Wall exec.cpp
exec.cpp: In function ‘int main(int, char**)’:
exec.cpp:10:25: error: invalid conversion from ‘const char**’ to ‘char* const*’ [-fpermissive]
     execvp(args[0], args);
                         ^
In file included from exec.cpp:1:0:
/usr/include/unistd.h:581:12: note:   initializing argument 2 of ‘int execvp(const char*, char* const*)’
 extern int execvp (const char *__file, char *const __argv[])
            ^~~~~~

我也尝试将args声明为char const *args[3],但编译器会发出相同的错误。我能够在没有警告的情况下编译它的唯一方法是在args的调用中强制execvp

const char *args[3];
...
execvp(args[0], (char* const*)args);

此版本在没有警告的情况下编译并成功运行。但是,我倾向于尽可能避免施放,因为这使我更难以推断出类型转换。

我在上面展示的两种工作方式之一是创建参数数组以传递给execvp的最佳方法,还是有更好的方法是明确的并且不会导致编译器抱怨?

我正在使用两个不同的编译器--g ++ 6.2.0用于Ubuntu x86_64上的本机编译,g ++ 4.5.3用于交叉编译到ARM平台。

编辑:

我不相信我的问题与this question重复。我了解使用const以不同方式对char*变量的不同影响。我特别询问传统上用于execvp次呼叫的类型,链接问题无法解答。

0 个答案:

没有答案