我很难弄清楚如何在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
次呼叫的类型,链接问题无法解答。