你能定义 main() 来接受不仅仅是 argc/argv 参数吗?

Can you define main() to take in more than argc/argv arguments?

本文关键字:argc 不仅仅是 argv 参数 定义 main      更新时间:2023-10-16

你能定义main()来接受多个参数吗,例如:

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

在 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中,编译器可以,但不需要,允许其他返回类型。此外,In C++ () 表示函数没有参数,相当于 C 的(void)。(C++还允许(void) C 兼容性。

编译器可以决定允许哪些签名(和返回类型)main,以及每个签名的程序行为。请参阅其文档以了解此问题。

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

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

是的,你可以以任何你想要的方式拥有main函数签名;但它不是标准的。

您必须更改编译器以接受新声明。并为其发出正确的代码。

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

同样,是

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

[basic.start.main]/2:

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

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

作为main的类型 (8.3.5)。

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

尽管确实支持某些main签名并且未被标准涵盖,例如:

int main( int, char**, char** )
相关文章: