C11标准声明:
5.1.2.2.1程序启动
- 醇>
程序启动时调用的函数名为main。该实现声明此函数没有原型。它应定义为返回类型
int
且没有参数:int main(void) { /* ... */ }
或有两个参数(此处称为
argc
和argv
,但可以使用任何名称,因为它们是声明它们的函数的本地名称):int main(int argc, char *argv[]) { /* ... */ }
或同等的; 10),或者以其他一些实现定义的方式。
10)因此,int可以被定义为
typedef
的{{1}}名称替换,或者int
的类型可以写为{{1}等等。
我们将忽略这一部分:或其他一些实现定义的方式。因为我只对与上述两个例子相当的定义感兴趣。
这是主要的有效定义,因为argv
和char ** argv
是等效的:
char* a[4]
VLA数组怎么样,我们假设char**
将返回一个正的int值:
int main(int argc, char* argv[4]){/*...*/}
答案 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
。第二个签名也是如此。