execvp的正确数组类型 在C++中,我很难精确地找到如何使用 ExcVP< 。我在让代码正常工作方面没有任何问题,但我特别想弄清楚如何以一种不会让编译器抱怨的方式来完成它

execvp的正确数组类型 在C++中,我很难精确地找到如何使用 ExcVP< 。我在让代码正常工作方面没有任何问题,但我特别想弄清楚如何以一种不会让编译器抱怨的方式来完成它,c++,arrays,types,exec,C++,Arrays,Types,Exec,我已经研究了有关堆栈溢出和其他资源的各种问题,但是我无法找到一个解决方案,该解决方案会导致编译器发出零警告 考虑下面的C++程序,它打印自己的源代码: #包括 int main(int argc,char*argv[]) { char*args[3]; args[0]=“/bin/cat”; args[1]=\u_文件\u_; args[2]=NULL; execvp(args[0],args); 返回0; } (我知道永远不应该到达返回0;我不太关心这个问题中的错误处理。) 当我编译它时,编

我已经研究了有关堆栈溢出和其他资源的各种问题,但是我无法找到一个解决方案,该解决方案会导致编译器发出零警告

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

#包括
int main(int argc,char*argv[])
{
char*args[3];
args[0]=“/bin/cat”;
args[1]=\u_文件\u_;
args[2]=NULL;
execvp(args[0],args);
返回0;
}
(我知道永远不应该到达
返回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*
指针数组是有意义的。考虑这个版本的程序:

#包括
int main(int argc,char*argv[])
{
常量字符*args[3];
args[0]=“/bin/cat”;
args[1]=\u_文件\u_;
args[2]=NULL;
execvp(args[0],args);
返回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]
,但编译器发出相同的错误。我能够让它在没有警告的情况下编译的唯一方法是在调用
execvp
时强制转换
args

const char*args[3];
...
execvp(args[0],(char*const*)args);
此版本在没有警告的情况下编译并成功运行。然而,我宁愿尽量避免使用强制转换,因为这会使我更难对正在进行的类型转换进行推理

我上面介绍的两种工作方式之一是创建要传递给
execvp
的参数数组的最佳方式,还是有一种更清晰且不会导致编译器抱怨的方式

我使用两种不同的编译器——g++6.2.0在Ubuntu x86_64上进行本机编译,g++4.5.3在ARM平台上进行交叉编译

编辑:


我不相信我的问题是重复的。我了解以不同方式使用
const
char*
变量的不同影响。我特别想问的是,哪种类型通常用于
execvp
调用,而链接的问题没有回答。

关于
auto args[3]={/bin/cat',文件,空ptr}?g++也不喜欢这样:
错误:“args”声明为“auto”数组。
。我不太熟悉AutoTo关键词——这是否需要将C++标准指定给G+++?C++ 11最小值(<代码> -STD= C++ 11 或<代码> -STD= C++ 14 )。不幸的是,我的交叉编译器不承认其中任何一个标志(我被一个古老的编译器所困扰)。本机g++确实可以识别它们,但同时使用
-std=c++11
-std=c++14
,但奇怪的是,对于
auto
的数组,仍然会发出相同的错误。另外,更重要的是,我要找出一些能与交叉编译器一起工作的方法,这样即使它能与本机编译器一起工作,它也不是一个解决方案?g++也不喜欢这样:
错误:“args”声明为“auto”数组。
。我不太熟悉AutoTo关键词——这是否需要将C++标准指定给G+++?C++ 11最小值(<代码> -STD= C++ 11 或<代码> -STD= C++ 14 )。不幸的是,我的交叉编译器不承认其中任何一个标志(我被一个古老的编译器所困扰)。本机g++确实可以识别它们,但同时使用
-std=c++11
-std=c++14
,但奇怪的是,对于
auto
的数组,仍然会发出相同的错误。另外,更重要的是,我要找出一些能与交叉编译器一起工作的方法,所以即使它能与本机编译器一起工作,它也不是一个解决方案。