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

时间:2009-10-05 12:47:07

标签: c++ qt

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

QApplication app(argc, argv);

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

int argc = 1;
char **argv; 
char arguments[1][12] = {{"cgalExample"}};
argv = arguments;

感谢任何提示。

6 个答案:

答案 0 :(得分:33)

快速而肮脏,但适用于QApplication

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

有关更完整且符合C标准的解决方案,请参阅D.Shawley's answer

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

array[i][j]会产生i*j矩阵。但你真正想要的是一个带有指向字符串指针的数组。

答案 1 :(得分:32)

如果你想成为疯狂的坠饰,那么你想要的东西如下。关键点是argv不是constargvNULL终止,argcargv 包括计划名称。它必须是可修改的,因此您不能使用字符串文字 - 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节)规定,托管环境中argcargv的情况如下:

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

QApplication声明如下:

  

警告argcargv引用的数据必须保持有效   QApplication的整个生命周期   宾语。此外,argc必须是。{1}}   大于零且argv必须   包含至少一个有效字符   字符串。

     

...

     

注意:argcargv可能会更改   当Qt删除命令行参数   它承认。

答案 2 :(得分:3)

为什么你对argv中文本的大小有所了解,我只是让编译器去做:

int argc = 1;
char* argv[] = {"Hello Qt!"}; // exactly as it is defined in main

答案 3 :(得分:3)

怎么样......

int argc = 2;
const char* argv[] ={"program","first-argument"}; 

......或者如果你需要它们是非常规的......

int argc = 2;
char* argv[] ={strdup("program"),strdup("first-argument")}; 

答案 4 :(得分:0)

虽然C和C ++标准都不需要它,但大多数编译器都将main的参数作为_argv和_argc提供给你。如果内存服务POSIX需要这个。无论如何,你需要使用类似的东西:

extern int _argc;
extern char *_argv[];

从那里你可以像平常一样使用它们。

答案 5 :(得分:-2)

我希望这有效:

char* argv[1];
argv[0] = "cgalExample";