C++ 定义自己的主函数参数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类型的对象,它需要主函数参数argc和argv作为输入:

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>。类型if
arg0
匹配
char(&)[12]
后将降级为
char*
。我只是养成了显式传递
char*
或数组引用的习惯。您正在使用常量char[]初始化char*。淘气!别忘了ab