{{Sidebar
|name = C語言標準
|style = width:auto;background:#f5faff;font-size:90%;line-height:1.6em;
|titlestyle = font-size:130%;padding-left:0.4em;padding-right:0.4em;background:#cee0f2; display:block;margin-bottom:6px;
|title = C語言標準
|headingstyle = padding:0.1em 0.25em 0.15em;{}
|heading1 = K&R C • ANSI C • C99 • C11 • C18 • C2x
|navbar = none
}}
C99(之前名稱為C9X)是ISO/IEC 9899:1999的非正式名稱,是C語言標準的一個版本。C99延伸了C90的內容,加入了C語言及標準函式庫的新功能,讓一些語言的實現(例如浮點數,以及編譯器技術)可以更妥善的利用電腦的硬體。後來在2011年發行的C11取代了此版本的C語言標準。
歷史
在ANSI的标准确立後,C语言的规范在一段时间内没有大的变动,然而C++在自己的标准化建立过程中继续发展壮大。《标准修正案一》在1994年为C语言建立了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广的国际字符集支持。不过,这个标准引出了1999年ISO 9899:1999的发表。它通常被称为C99。C99被ANSI于2000年3月采用。
設計
在C99中包括的特性有:
- 增加了对编译器的限制,比如源始碼每行要求至少支持到 4095 字节,变量名函数名的要求支持到 63 字节(extern 要求支持到 31)。
- 增强了预处理功能。例如:
** 巨集支持取可变参数 #define Macro(...) __VA_ARGS__
** 使用巨集的时候,允许省略参数,被省略的参数会被扩展成空串。
** 支持//开头的单行注释(这个特性实际上在C89的很多编译器上已经被支持了)
- 增加了新关键字restrict, inline, _Complex, _Imaginary, _Bool
** 支持long long, long double _Complex, float _Complex 等类型
- 支持不定长的数组,即数组长度可以在运行时决定,比如利用变量作为数组长度。声明时使用 int a[var] 的形式。不过考虑到效率和实现,不定长数组不能用在全局,或 struct 与 union 。
- 变量声明不必放在语句块的开头,for语句提倡写成for(int i=0;i 的形式,即i只在for语句块内部有效。
- 允许采用type-name{xx,xx,xx}这样类似C++的构造函数的形式构造匿名的结构体,即复合文字特性。
- 初始化结构体的时候允许对特定的元素赋值,形式为:
*: struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 };
*: struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是对 .c,.d 赋值的
- 格式化字符串中,利用 \u 支持 unicode 的字符。
- 支持 16 进制的浮点数的描述。
- printf, scanf 的格式化串增加了对 long long int 类型的支持。
- 浮点数的内部数据描述支持了新标准,可以使用 #pragma 编译器指令指定。
- 除了已有的 __LINE__和__FILE__ 以外,增加了__func__得到当前的函数名。
- 允许编译器化简非常数的表达式。
- 修改了/和%处理负数时的定义,这样可以给出明确的结果,例如在C89中-22 / 7 = -3, -22 % 7 = -1,也可以-22 / 7= -4, -22 % 7 = 6。 而C99中明确为 -22 / 7 = -3, -22 % 7 = -1,只有一种结果。
- 取消了函数返回类型默认为 int 的规定。
- 允许在 struct 的最后定义的数组不指定其长度,写做 [](flexible array member)。
- const const int i 将被当作 const int i 处理。
- 增加和修改了一些标准头文件,比如定义 bool 的 ,定义一些标准长度的int的,定义复数的,定义宽字符的,类似于泛型的数学函数,浮点数相关的。在增加了va_copy用于复制...的参数。里增加了struct tmx,对struct tm做了扩展。
- 输入输出对宽字符以及长整数等做了相应的支持。
版本检测
标准宏__STDC_VERSION__被定义为值199901L来指示能够获得C99支持。就像__STDC__宏用于C90,__STDC_VERSION__可被用来书写对于C90和C99编译器进行不同编译的代码,下面的例子确保了inline在二者情况下都可获得(通过在C90中将其替代为static来避免连接器错误):
#if __STDC_VERSION__ >= 199901L
/ "inline" is a keyword /
#else
define inline static
#endif
实现
用于x86架构的GCC和Clang以及其它一些商业编译器如IAR Systems和ICC现在支持C99的全部特性,而微软和Borland支持C99的部分特性。
參考資料
延伸閱讀
*
*
- [http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf Rationale for International Standard—Programming Languages—C Revision 5.10], April-2003, Rationale for C99
外部連結
- [http://www.open-std.org/jtc1/sc22/wg14/www/newinc9x.htm New things in C9X]
- [http://www.cplusplus.com/articles/iz3hAqkS/ Features of C99]
评论 (0)