服务端相关 / 04 C 语言的标准

C 语言的标准

什么是标准?标准是对重复性事物和概念所做的统一规定,他以科学技术和实践经验的结合成果为基础,经有关方面协商一致,由主管机构批准,以特定形式发布作为共同遵守的准则和依据。

在这个标准概念大行其道的今天,如果大家在生活中稍微注意一下,其实可以很容易发现,我们生活在一个标准化的世界里,每个产品的外包装或者标签上都会注明相应的执行标准。标准贯穿着我们的衣食住行。。总而言之,标准无处不在。

当然标准具有行业性与地域性。每个国家基本都有自己的标准,这些标准有些是自己独立创造的,但更多的,为了与国际上大部分标准兼容,基本上会使用国际上一些通用的标准,只是改一下名字就可以了。

作为软件行业中的老大哥级人物。C 语言也有自己的标准,而且是国际标准。

如果大家遵循同一个标准,那么就会避免分歧的产生,避免出现很多不必要的麻烦和困扰。按照这统一标准就不会出现不兼容的问题。

我们先来看下 C 语言标准的发展历史:

1. C 语言标准历史

序号 别称 全称
1 C18 ISO/IEC 9899:2018
2 C11 ISO/IEC 9899:2011
3 C99 ISO/IEC 9899:1999
4 C95 ISO/IEC 9899:1990/AMD 1:1995
5 C90 ISO/IEC 9899:1990
6 C89 ANSI X3.159-1989

最新执行的 C 语言的国际标准是序号为 1 的 C18 标准(ISO/IEC 9899:2018 (C18)),这个标准是 2018 年通过的 C 语言国际标准。那么 C 语言的标准中都规定了哪些内容呢?下面我们一起来看下:

2. C 语言标准内容

这里我将国际标准化组织最新的 C 语言的标准的一部分内容放在这里,因为所有的标准都不是免费提供的,有兴趣的同学可以购买看一下全文。

那么这些标准里面都有哪些内容呢?

因为我并没有购买 C 语言的最新标准,所以我找了一点来自于 C 语言标准中描述。下面这段话就通过文字的描述,定义了有关 main 函数的细节:

The function called at program startup is named main. The implementation 
declares no prototype for this function. It shall be defined with a return 
type of int and with no parameters:
       int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names 
may be used, as they are local to the function in which they are declared):
       int main(int argc, char *argv[]) { /* ... */ }
or equivalent;10) or in some other implementation-defined manner.

这里写明了 main 函数是做什么的,应该怎么写,包含了什么参数以及返回值等。正确的 main 函数的正确的书写方法应该是 int main(void) { /* ... */ } 或者 int main(int argc, char *argv[]) { /* ... */ } 。而不是我们国内随处可以看到的 void main(void) {/* ... */} 或者 void main(int argc, char *argv[]) { /* ... */ }。这种写法在有的编译器下是会产生错误的,导致编译无法进行。而且这个返回值是可以输出的,可以作为程序是否正确执行的判断,比如你可以用返回值 0 放在程序执行完整后返回,返回 0 就可以判断程序完整执行了。如果返回了其他数值,那么程序就出现了异常。

由于购买标准太贵了,需要 198 瑞士法郎,折合人民币 1422.08 元,所以这里只能给大家看一点从其他网站上找到的信息。不过超过 500 页的标准全文对于大家学习这门语言也没有太大的益处。只要记住在最新的是最好的就可了。

3. 小结

标准的重要性不用过多赘述,如同大家使用的众多版本的安卓手机,和只有一个版本的苹果手机系统一样。过多的标准会让开发者无所适从,各自对于自己系统的魔改优化,只能让普通用户陷入深渊。因此为了避免各自为政的情况出现, C 语言很早就有了自己的标准,这样就可以完成一统天下的局面。虽然各个编译器有自己的局部特点,但是总体而言,只要是按照 C 语言标准编写的程序可以在任何一个编译器上通过编译。