【问题标题】:Different ways to declare main in C [duplicate]在C中声明main的不同方法[重复]
【发布时间】:2012-10-29 00:33:05
【问题描述】:

可能重复:
Alternate C syntax for function declaration use cases

我在旧的 C 程序中看到了 main() 的这个非常不同的定义。 (它确实编译,使用 gcc)

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

   }

声明了哪些类型的变量,为什么要在函数大括号开始之前声明它们?

【问题讨论】:

  • 不太清楚如何搜索。
  • 不投票结束,因为如果有任何事情,应该保留这个,因为它有一个更易于搜索、更具体的标题。
  • @djechlin:只是因为另一个标题是废话。我们应该把这个标题改成那个问题,然后把这个问题作为一个副本结束。
  • @LightnessRacesinOrbit - 耸耸肩。完成。

标签: c


【解决方案1】:

这是 C 中旧的函数定义风格。这种非原型风格在 C 标准中被标记为过时,不应使用。

并且在 C 中不再允许省略返回类型(隐式 int)。

【讨论】:

    【解决方案2】:

    这称为 K&R 风格的定义。您基本上只是列出参数并在结束参数括号和开始大括号之间声明它们。

    【讨论】:

      【解决方案3】:

      这是 1989 C 之前的旧 KnR C 风格(非标准)。这是一种将参数传递给函数的方法.. 不仅与 main() 一样,其他所有函数也是如此。

      例如:

      void non_main(argx, argy)
      int argx,argy;
      {
         /*do something here*/
      }
      

      【讨论】:

      • 它仍然是标准的,即使在 2011 ISO C 标准中,但它已经过时并且不应该使用。
      【解决方案4】:

      这只是指定main 参数类型的另一种方法。它完全等同于main(int argc, char *argv[])。这被称为 K&R 风格,因为它是原始 C 编译器和 K&R 书籍中使用的原始风格。它被认为是过时的;它与 C++ 不兼容。有一个 GCC 选项可以警告它,-Wold-style-definition,但您仍然会在一些旧代码中看到它。

      【讨论】:

      • 不等价。例如,如果您有一个函数调用main(a, b) 并且adouble 类型的对象,则a 不会像原型定义那样转换为int
      • @ouah 感谢您的澄清;我没想到。
      【解决方案5】:

      它根据 C 规范隐式返回 int(尽管根据 this 中的其他答案以及在 C99 中已过时的链接问题?),与未声明返回类型的函数一样。

      这是一种老式的声明方式,它来自 Fortran。

      main(argc, argv)
         int argc;
         char *argv[];
      

      准确地告诉您您的期望 - argc 是 intargvchar * 的数组。

      【讨论】:

      • 你确定隐式返回类型对于 ISO C 是真的吗? C99 5.1.2.2.1/1 建议不要;根据我的解释,6.7.2/2 明确表示。
      • 不确定,已相应编辑。
      • 有兴趣看到一些标准中关于隐式回报的引用。
      猜你喜欢
      • 2011-11-20
      • 2019-02-26
      • 1970-01-01
      • 2020-12-17
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      相关资源
      最近更新 更多