这些C';它的主要功能是什么?
可能重复:这些C';它的主要功能是什么?,c,main,C,Main,可能重复: 我见过很多C的主要函数风格和编写语法,但我不太明白这种语法是什么意思。有人能简单介绍一下每种语法吗? 为什么无效?为什么是int?为什么使用void,int作为参数 void main() { } int main() { } int main(void) { } void main(void) { } int main(int) { } int main(int argc, char* argv[]) { } c标准规定了两种形式的一致性实施: 托管实施
我见过很多C的主要函数风格和编写语法,但我不太明白这种语法是什么意思。有人能简单介绍一下每种语法吗? 为什么无效?为什么是int?为什么使用void,int作为参数
void main() {
}
int main() {
}
int main(void) {
}
void main(void) {
}
int main(int) {
}
int main(int argc, char* argv[]) {
}
c标准规定了两种形式的一致性实施:
- 托管实施和
- 独立实现
- 托管环境&
- 独立环境
独立环境
&什么是托管环境
?
独立实现是为在没有操作系统的情况下执行的程序而设计的。
例如:OS内核或嵌入式环境将是独立的环境
使用操作系统设施的程序通常位于托管实现中
c程序如何在这两种环境中执行?有什么区别?
C程序在这两种环境中开始执行的方式不同。对于独立环境,程序启动可以通过任何实现定义的函数进行即使是
main()
也不要求存在
因此,问题中提到的任何函数定义都可能有效,这取决于独立环境的实现。它们的函数参数和返回值将具有实现定义的含义,因此您需要查看它们的文档以了解它们的精确含义
参考资料:
5.1.2.1独立式环境
在一个独立的环境中(在这个环境中,C程序可以在没有任何
操作系统的优点),程序调用的函数的名称和类型
启动是实现定义的。可供独立图书馆使用的任何图书馆设施
除第4条要求的最小集合外,程序是实现定义的
对于托管环境,标准要求程序执行从执行main()
函数开始,并要求如何定义此函数
其规格见:
C99标准:5.1.2.2托管环境
5.1.2.2.1程序启动
1程序启动时调用的函数名为main。实现声明没有
此功能的原型。它应定义为int返回类型,且不包含
参数:
int main(void) { /* ... */ }
[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 ~]$
int main(int)
或者使用两个参数(此处称为argc和argv,但可以使用任何名称)
使用,因为它们是声明它们的函数的本地函数):
或同等品;或者以其他实现定义的方式
void
,因为返回类型意味着作者不想向调用者(程序的调用者)返回任何有意义的值。根据操作系统的不同,这可能是可以接受的,或者可能会对启动程序的任何程序造成微妙的困难
void
,因为该参数意味着程序将不使用常规方法检查命令行参数。有些环境提供了获取它们的替代方法;其他人则不然。在后一种情况下,这意味着程序忽略任何命令行参数
main(int)
允许程序检查在命令行上传递给程序的参数数量,但不检查其值。这样的安排并不常见,但在许多实现中执行此操作的一个程序是Unix/Linuxwho
命令,该命令列出登录用户,除了who am i
仅列出当前用户。正如你是谁
一样(因为两者都有两个参数:
int main(void) { /* ... */ }
[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 ~]$
int main(int)
简单地说
如果您不关心用户指定的命令行参数,并且不想设置退出代码,则可以编写以下代码:
void main()
没有参数,但要设置退出代码:
int main()
与previos相同,但采用旧的C样式:
int main(void)
void main(void)
与第一个相同,但采用旧的C样式:
int main(void)
void main(void)
如果只想知道命令行参数的数量:
int main(void) { /* ... */ }
[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 ~]$
int main(int)
以及最完整的变体:
int main(int argc, char* argv[])
argc是一个参数计数,argv是一个参数数组,该函数返回一个退出代码。无论是
void main()
还是void main(void)
都无效。main
函数必须返回int
@CodyGray:…类型的值,但在“独立环境”(5.1.2.1)中除外@undur_gongor:事实上,一个独立的环境甚至可能没有main()
。可以找到完整的答案。该答案的第一行也适用于此处发布的答案…此答案中您建议void main()
和/或void main(void)的部分
可能有效但不正确。我不知道你所说的“旧C风格”是什么意思,但是main
也没有返回void
。这个答案很混乱,没有提到托管/独立环境。有些表单在托管环境中是不正确的。我不知道什么是“旧C风格”要么是。@CodyGray:只有当你假设一个托管环境,而OP并没有假设它。@Lundin:是的,总是有一个嵌入式C程序员来告诉你,“嗯,事实上,在某些普通程序员永远不会工作的情况下,这是不正确的,因为实现定义了一些不同的东西,标准技术上说它可以由实现定义。”是的。所有这些都是正确的。是的,事实上,提问者从未指定它是否是托管环境。B