来自 ISO/IEC 9899:2024, 5.1.2.3.2, 程序启动:
程序启动时调用的函数名为
。这 实现没有声明此函数的原型。应该是 定义返回类型为main
并且不带参数:int
int main(void) { /* ... */ }
或带有两个参数(此处称为
和argc
,尽管可以使用任何名称,因为它们是本地的 声明它们的函数):argv
int main(int argc, char *argv[]) { /* ... */ }
或等价物;6) 或以其他某种实现定义的方式。
页面末尾的脚注说:
- 因此,
可以用定义为int
的typedef名称替换,或者int
的类型可以写成argv
,或者 返回类型可以通过char ** argv
指定,依此类推。typeof(1)
由此,我得出结论,
main()
的原型可以是以下任何一个:
1. int main(void) { /* ... */ }
/* Because function declarations whose parameter list is empty is treated the same
as a parameter list that contains only a single void in C23. */
2. int main() { /* ... */ }
3. int main(int argc, char *argv[]) { /* ... */ }
4. int main(int argc, char **argv) { /* ... */ }
/* Or any other value than 1 that fits in the range of an int. */
5. typeof(1) main() { /* ... */ } /* And all the other aforementioned variants as well. */
6. typedef int val;
val main(val argc, char **argv) { /* ... */ } /* And all the other aforementioned variants as well. */
还有其他类型等价吗?来自 https://codereview.stackexchange.com 的@Davislor 说:
第 6.7.6.3 节指出,在函数声明中,
和*argv[]
是“兼容类型”。const **argv
所以第七个变体可以是:
7. int main(int argc, char const **argv) { /* ... */ }
那么呢:
int main(const int argc, char const **argv) { /* ... */ }
还有其他兼容类型,如果还有的话?
参数
和argc
以及argv
指向的字符串 数组应可由程序修改,并保留其最后存储的 程序启动和程序终止之间的值。argv
IMO 它阻止了这种形式的
main
功能