这是main()

时间:2015-06-23 10:54:54

标签: c standards language-lawyer c11

C11标准声明:

  

5.1.2.2.1程序启动

     
      
  1. 程序启动时调用的函数名为main。该实现声明此函数没有原型。它应定义为返回类型int且没有参数:

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

    或有两个参数(此处称为argcargv,但可以使用任何名称,因为它们是声明它们的函数的本地名称):

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

    或同等的; 10),或者以其他一些实现定义的方式。

  2.               

    10)因此,int可以被定义为typedef的{​​{1}}名称替换,或者int的类型可以写为{{1}等等。

我们将忽略这一部分:或其他一些实现定义的方式。因为我只对与上述两个例子相当的定义感兴趣。

这是主要的有效定义,因为argvchar ** argv是等效的:

char* a[4]

VLA数组怎么样,我们假设char**将返回一个正的int值:

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

2 个答案:

答案 0 :(得分:5)

是的,这全部由"或等效的"覆盖。有关重命名参数或使用typedef ed类型的脚注只是示例。

我最喜欢的变体是

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

因为它拥有关于所有main函数的语义的最多信息。

答案 1 :(得分:2)

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

main的有效签名。编译器会忽略4中的char argv[4],它等同于char argv[] = char **argv。第二个签名也是如此。