定义自己的主要函数参数argc和argv

24 c++ qt

我想创建一个QApplication类型的对象,它需要主函数参数argc和argv作为输入:

QApplication app(argc, argv);
Run Code Online (Sandbox Code Playgroud)

由于我在用户定义的函数内,无法访问main函数,我想自己定义这个参数.我尝试了几种方法,但我无法获得正确的类型转换.我的最后一种方法也不起作用:

int argc = 1;
char **argv; 
char arguments[1][12] = {{"cgalExample"}};
argv = arguments;
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何提示.

Geo*_*lly 37

快速而肮脏,但努力QApplication:

char *argv[] = {"program name", "arg1", "arg2", NULL};
int argc = sizeof(argv) / sizeof(char*) - 1;
Run Code Online (Sandbox Code Playgroud)

有关更完整和符合C标准的解决方案,请参阅D.Shawley的回答.

为什么您的解决方案不起作用很简单:

array[i][j]得到一个i*j矩阵.但你真正想要的是一个数组,其中包含指向字符串的指针.

  • 可能要提一下,第一个参数是程序名称. (3认同)

D.S*_*ley 33

如果你想成为疯狂的坠饰,那么你想要的东西如下.关键点在于argv不是const,argvNULL终止,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();
}
Run Code Online (Sandbox Code Playgroud)

标准(ISO/IEC 9899:1999节5.1.2.2.1)指出,以下是真实的约argcargv在托管环境:

  • argc应为非负值.
  • argv[argc] 应为空指针.
  • 如果值argc大于零,则argv[0]通过argv[argc-1]包含的数组成员应包含指向字符串的指针,这些指针在程序从托管环境中的其他位置启动之前由主机环境给出实现定义的值.如果主机环境不能提供大写和小写字母的字符串,则实现应确保以小写形式接收字符串.
  • 如果值argc大于零,则指向的字符串argv[0]表示程序名称 ; argv[0][0]如果程序名不能从主机环境获得,则应为空字符.如果值argc大于1,则argv[0]through 指向的字符串argv[argc-1]表示程序参数.
  • 数组指向的参数argcargv字符串argv应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.

QApplication 声明如下:

警告:所说的数据通过argcargv必须保持有效的的整个生命周期QApplication 的对象.此外,argc必须大于零且argv必须至少包含一个有效的字符串.

...

注意:argc并且argv可能会更改,因为Qt会删除它识别的命令行参数.

  • @alex tingle:看一下C99第6.7.8节第14节或C++ 98第8.5.2节第1节.两者都明确指出_a`char`数组可以从字符串文字初始化(可选地用括号括起来); string-literal的连续字符初始化数组的成员._ (3认同)