如何在没有警告的情况下使用 execv()?
Posted
技术标签:
【中文标题】如何在没有警告的情况下使用 execv()?【英文标题】:How to use execv() without warnings? 【发布时间】:2012-05-28 21:44:06 【问题描述】:我正在使用 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() 所需的类型)仍然会产生警告。
谢谢。
【问题讨论】:
这给出一个错误,而不是一个警告。 【参考方案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 位指针?以上是关于如何在没有警告的情况下使用 execv()?的主要内容,如果未能解决你的问题,请参考以下文章
做出反应。如何在没有警告的情况下将 Grid 插入 TabPanel?