这是原型execv
:我可以传递一个const char *数组给execv吗?
int execv(const char *path, char *const argv[]);
我可以通过作为第二个参数的const char
指针的数组?
这个例子程序给出了当USE_CAST
未设置警告:
#include <unistd.h>
int main(int argc, char *argv[])
{
if (argc > 0) {
const char *exe_name = "/bin/echo", *message = "You ran";
const char *exe_args[] = { exe_name, message, argv[0], NULL };
#ifdef USE_CAST
execv("/bin/echo", (char **) exe_args);
#else
execv("/bin/echo", exe_args);
#endif
}
return 0;
}
编译时,GCC说,“从传递兼容的指针类型‘execv’的论点2:”如果我不使用投。
从POSIX documentation为execv
(中途理由部分),它看起来像第二个参数是为了向后兼容一个char *const
数组:
约
argv[]
和envp[]
是常数包含的语句,以向未来的作者明确表示这些对象是完全不变的语言绑定。 ...不幸的是,第四列不能使用...
其中“第四列”是指const char* const[]
。
这个(char **)
可以放心使用吗?我应该创建一个char *
数组并将其传递给execv
而不是?
不知何故,我认为字符串文字是'const char'。我认为,从我使用的变量中抽出“const”并不是那么糟糕,尽管我开始认为我误解了常量的正确性,或者它在C中并不总是实际可行的。 – yellowantphil
@anaranjada ,不过,标准规定它们是'char'类型的数组,尽管在实践中它们可能是不可写的。 GCC可以选择使用'const char'数组来替代,以帮助您找到试图写入其中的地方 - 也许这正是您想要的。 (因为这个原因,当你启用该选项时'gcc'不合格。) –
是的,我认为GCC选项让我失望。无论如何,我从代码中删除了一些'const'限定符,现在编译时没有警告。谢谢。 – yellowantphil