C++ 定义自己的主函数参数argc和argv
我想创建一个QApplication类型的对象,它需要主函数参数argc和argv作为输入:C++ 定义自己的主函数参数argc和argv,c++,qt,C++,Qt,我想创建一个QApplication类型的对象,它需要主函数参数argc和argv作为输入: QApplication app(argc, argv); 因为我在一个用户定义的函数中,无法访问主函数,所以我想自己定义这个参数。我尝试了几种方法,但无法正确地进行类型转换。我的上一个方法也不起作用: int argc = 1; char **argv; char arguments[1][12] = {{"cgalExample"}}; argv = arguments; 感谢您的提示。快速且
QApplication app(argc, argv);
因为我在一个用户定义的函数中,无法访问主函数,所以我想自己定义这个参数。我尝试了几种方法,但无法正确地进行类型转换。我的上一个方法也不起作用:
int argc = 1;
char **argv;
char arguments[1][12] = {{"cgalExample"}};
argv = arguments;
感谢您的提示。快速且肮脏,但为
QApplication工作
:
char *argv[] = {"program name", "arg1", "arg2", NULL};
int argc = sizeof(argv) / sizeof(char*) - 1;
有关更完整且符合C标准的解决方案,请参阅。
解决方案不起作用的原因很简单:
数组[i][j]
生成一个i*j
矩阵。但实际上,您需要的是一个数组,其中包含指向字符串的指针。为什么您要担心argv中文本的大小,我会让编译器来做:
int argc = 1;
char* argv[] = {"Hello Qt!"}; // exactly as it is defined in main
那么
int argc = 2;
const char* argv[] ={"program","first-argument"};
…或者如果你需要它们是非常量的
int argc = 2;
char* argv[] ={strdup("program"),strdup("first-argument")};
我希望这能奏效:
char* argv[1];
argv[0] = "cgalExample";
<>虽然C和C++标准都不需要,但是大多数编译器都将主元素的参数作为AGARV和A~ARGC。如果内存为POSIX服务,则需要这样做。无论如何,您需要使用以下内容:
extern int _argc;
extern char *_argv[];
从那以后,你可以像平常一样使用它们。如果你想疯狂地挥舞,那么你需要下面这样的东西。关键点是
argv
不是const
,argv
是NULL
终止,argc
是argv
中包括程序名在内的可用元素数。它必须是可修改的,因此不能使用字符串文字-argv[i]
必须指向可修改的字符数组
int my_main() {
char arg0[] = "programName";
char arg1[] = "arg";
char arg2[] = "another arg";
char* argv[] = { &arg0[0], &arg1[0], &arg2[0], NULL };
int argc = (int)(sizeof(argv) / sizeof(argv[0])) - 1;
QApplication the_application(argc, &argv[0]);
return the_application.run();
}
本标准(ISO/IEC 9899:1999第5.1.2.2.1节)规定,以下内容适用于托管环境中的argc
和argv
:
的值应为非负argc
应为空指针argv[argc]
- 如果
的值大于零,则数组成员argc
到argv[0]
应包含指向字符串的指针,在从宿主环境中的其他位置启动程序之前,宿主环境为其提供了实现定义的值。如果主机环境无法提供包含大写和小写字母的字符串,则实现应确保以小写字母接收字符串argv[argc-1]
- 如果
的值大于零,则argc
指向的字符串表示程序名argv[0]
如果程序名在主机环境中不可用,则应为空字符。如果argv[0][0]
的值大于一,则argc
通过argv[0]
指向的字符串表示程序参数argv[argc-1]
- 程序应可修改参数
和argc
以及argv
数组指向的字符串,并在程序启动和程序终止之间保留其最后存储的值argv
argc
和argv
引用的数据必须在
QApplication的整个生命周期
对象此外,argc
必须
必须大于零且argv
至少包含一个有效字符
绳子
注意:argc
和argv
可能会更改
as Qt删除命令行参数
它承认这一点
你能澄清一下什么不起作用吗?没有编译?执行错误?未执行预期操作?Visual Studio 2008下的编译器错误:无法转换类型。gs的提示效果很好。但有一点是不可编译的:“错误:括号内的初始值设定项用于初始化'char*'”@alex It compiles fine with me(VC2008)。您使用的编译器是什么?是的,但是argv数组本身不是必须以null结尾吗?@gimpf,这是一个完全不同的问题。
execl
函数接受以null结尾的参数argv
本身不是以null结尾的。@gs:标准要求argv
以null
结尾。请参阅我的答案,以获得确切的文本。非常感谢。这一个是在VS 2008下编译的。可能需要提到的是第一个参数是程序名。程序名和NULL的正确性很好,但是char*仍然应该指向可变字符串。。。文字字符串不是。如果argv[argc]!=无效的代码应该能够依赖于此。只有一个问题,它是否应该是(int)((sizeof…)-1)?否则argc[argv]将指向一个经过空的…@gimpf:我刚刚注意到了。谢谢。@alex tingle:看看C99第6.7.8节第14条或C++98第8.5.2节第1条。两者都清楚地说明可以从字符串文本初始化char
数组(可以选择用大括号括起来);字符串文本的连续字符初始化数组的成员。&arg0[0]
与arg0
不一样吗?@gs:大多数情况下都是这样。C++将选择一个模板特化,如“代码>模板空Fo(t(&))[n],代码>过<代码>模板无效fo(t Valb)< /C>。类型ifarg0
匹配char(&)[12]
后将降级为char*
。我只是养成了显式传递char*
或数组引用的习惯。您正在使用常量char[]初始化char*。淘气!别忘了ab