可能重复:
Why is the type of the main function in C and c++ left to the user to define?
我遇到过许多C的主要功能风格和写作语法,但我实际上并没有得到这种语法意味着什么,任何人都可以简要介绍每种语法? 为什么无效?为什么int?为什么void,int作为参数?
void main() {
}
int main() {
}
int main(void) {
}
void main(void) {
}
int main(int) {
}
int main(int argc, char* argv[]) {
}
答案 0 :(得分:8)
c标准规定了两种符合实现的形式:
基于两种类型的环境,c标准定义为:
什么是freestanding Environment
&什么是Hosted Environment
?
独立实现是专为在没有操作系统优势的情况下执行的程序而设计的。 对于Ex:OS内核或嵌入式环境将是一个独立的环境。
使用操作系统功能的程序通常位于托管实现中。
c程序如何在这两种环境中执行?有什么区别?
C程序如何在这两种环境中开始执行有所不同
对于独立环境,程序启动可以通过任何实现定义的函数来实现。 即使main()
存在。
因此,问题中提到的任何函数定义都可以有效,具体取决于该独立环境的实现。并且它们的函数参数和返回值将具有实现定义的含义,因此您需要检查其文档以了解其精确含义。
参考:
5.1.2.1独立环境
在独立环境中(C程序执行可能在没有任何情况下执行) 操作系统的好处),在程序中调用的函数的名称和类型 startup是实现定义的。任何独立的图书馆设施 程序,除了第4条要求的最小集合外,都是实现定义的。
对于托管环境,标准要求程序执行从执行main()
函数开始,并且还要求如何定义此函数。
相同的规格见:
C99标准:5.1.2.2托管环境
5.1.2.2.1程序启动
1程序启动时调用的函数名为main。实施宣布否 这个功能的原型。它应该使用返回类型int和no来定义 参数:
int main(void) { /* ... */ }
或有两个参数(这里称为argc和argv,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):
int main(int argc, char *argv[]) { /* ... */ }
或同等的;或者以其他一些实现定义的方式。
答案 1 :(得分:2)
void
作为返回类型意味着作者意味着不向调用者(程序的调用者)返回任何重要值。根据操作系统的不同,这可能是可以接受的,或者可能会导致程序启动时出现细微的困难。
void
作为参数意味着程序将不使用检查命令行参数的传统方法。有些环境提供了获取它们的替代方法;别人不这样做。在后一种情况下,它意味着程序忽略任何命令行参数。
main (int)
允许程序检查在命令行上传递给程序的参数数量,但不检查它们的值。这种安排并不常见,但是在许多实现中执行此操作的一个程序是Unix / Linux who
命令,该命令列出已登录的用户,但who am i
仅列出当前用户。就像who is you
一样(因为两者都有两个参数:
[wally@lenovotower ~]$ who
wally tty1 2012-01-31 22:24 (:0)
wally pts/0 2012-01-31 22:24 (:0)
wally pts/1 2012-01-31 22:33 (:0)
wally pts/2 2012-01-31 22:34 (msi)
root pts/3 2012-01-31 22:34 (msi)
[wally@lenovotower ~]$ who am i
wally pts/0 2012-01-31 22:24 (:0)
[wally@lenovotower ~]$ who are you
wally pts/0 2012-01-31 22:24 (:0)
[wally@lenovotower ~]$
答案 2 :(得分:-1)
ОК,简要说明。
如果您不关心用户指定的命令行参数,并且您不想设置退出代码,则可以写下:
void main()
没有参数,但想设置退出代码:
int main()
与previos相同,但采用旧C风格:
int main(void)
与第一个相同,但采用旧C风格:
void main(void)
如果您只想知道命令行参数的数量:
int main(int)
最完整的变体:
int main(int argc, char* argv[])
argc是参数计数,argv是参数数组,函数返回退出代码。