你能定义main()来接受argc / argv以上的参数吗?

时间:2014-11-26 00:48:56

标签: c++ c

你能定义main()来获取多个参数,例如:

int main(int argc1, int argc2, char* argv1[], int* argv2[])

4 个答案:

答案 0 :(得分:7)

在C中,main的唯一便携式定义是:

int main(void) { /* ... */ }

int main(int argc, char *argv[]) { /* ... */ }

或同等学历。允许使用其他实现定义的表单 - 但是作为术语"实现定义的"暗示,如果你的编译器选择允许,他们只允许

有一些常见的扩展名,例如:

int main(int argc, char *argv[], char *envp[]) { /* ... */ }

但我怀疑任何编译器都支持您建议的特定表单。我不确定它会如何有用;现有的argc / argv表单允许任意多个命令行参数。

C ++与C略有不同,因为它要求返回类型为int;在C中,编译器可以但不必允许其他返回类型。此外,在C ++中()意味着函数没有参数,相当于C (void)。 (C ++也允许(void) C兼容。)

答案 1 :(得分:1)

您的编译器可以决定允许main的签名(和返回类型),以及程序对每个签名的行为。请查阅其文档以了解相关信息。

所有编译器必须支持的唯一签名是两个标准签名(和等效的):

int main(void)
int main(int, char **)

答案 2 :(得分:1)

[basic.start.main] / 2:

  

实现不应预定义main函数。这个   功能不得超载。它应具有声明的返回类型   int类型,但其类型是实现定义的。一个   实施应允许两者

     
      
  • ()返回int
  • 的函数   
  • (int的函数,指针指向char)的指针返回int
  •   
     

作为main的类型(8.3.5)。

理论上,一个实现可以允许问题中提到的签名 - 但它将是非常荒谬的,似乎没有相关的编译器支持它。 (它会通过什么?)

虽然有main的某些签名确实得到支持且未被标准涵盖,例如:

int main( int, char**, char** )

答案 3 :(得分:0)

是的,你可以任意方式拥有main功能签名;但它不会是标准的。

您必须更改编译器才能接受新的声明。并为它发出适当的代码。

您可能需要更改操作系统才能将用户的参数正确传递给您的程序。

同样,是的,其他声明可能,但它们不是标准的,需要修改操作系统和工具链。