Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这些C';它的主要功能是什么?_C_Main - Fatal编程技术网

这些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标准规定了两种形式的一致性实施:

  • 托管实施和
  • 独立实现
基于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/Linux
who
命令,该命令列出登录用户,除了
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