可能重复:
函数声明用例的替代 C 语法
main()
我在一个旧的 C 程序中看到了这个非常不同的定义。(它使用 gcc编译)
main(argc, argv)
int argc;
char *argv[];
{
...
...
}
声明了什么样的变量,为什么要在函数大括号开始之前完成它们?
可能重复:
函数声明用例的替代 C 语法
main()
我在一个旧的 C 程序中看到了这个非常不同的定义。(它使用 gcc编译)
main(argc, argv)
int argc;
char *argv[];
{
...
...
}
声明了什么样的变量,为什么要在函数大括号开始之前完成它们?
这是 C 中函数定义的旧风格。这种非原型风格在 C 标准中被标记为过时,不应使用。
int
并且在 C 中不再允许省略返回类型(隐式)。
它根据 C 规范隐式返回int
(尽管根据 this 中的其他答案和链接的问题 this 在 C99 中已过时?),与具有未声明返回类型的函数一样。
这是一种老式的声明方式,它来自 Fortran。
main(argc, argv)
int argc;
char *argv[];
准确地告诉您您的期望 - argc 是一个int
并且argv
是char *
.
这称为 K&R 风格的定义。您基本上只是列出参数并在结束参数括号和开始大括号之间声明它们。
那是 1989 C 之前的旧 KnR C 风格(非标准)。这是一种将参数传递给函数的方法.. 不仅与 main() 一样,其他所有函数也是如此。
例如:
void non_main(argx, argy)
int argx,argy;
{
/*do something here*/
}
这只是指定参数类型的另一种方法main
。它完全等同于main(int argc, char *argv[])
。这被称为 K&R 风格,因为它是原始 C 编译器和 K&R 书籍中使用的原始风格。它被认为是过时的;它与 C++ 不兼容。有一个 GCC 选项可以警告它,-Wold-style-definition
但是您仍然会在一些旧代码中看到它。