ANSI C
ANSI C是美国国家标准协会(ANSI)对C语言发布的标准。使用C的软件开发者被鼓励遵循ANSI C文档的要求,因为它鼓励使用跨平台的代码。
目录 |
ANSI C和ISO C的历史 [编辑]
C 的第一个标准是由ANSI发布的。虽然这份文档后来被国际标准化组织(ISO)采纳并且ISO发布的修订版也被ANSI采纳了,但名称ANSI C(而不是 ISO C)仍被广泛使用。一些软件开发者使用ISO C,还有一些使用 Standard C。
C89 [编辑]
1983年,美国国家标准协会组成了一个委员会,X3J11,为了创立 C 的一套标准。经过漫长而艰苦的过程,该标准于1989年完成,并在作为ANSI X3.159-1989 "Programming Language C"正式生效。这个版本的语言经常被称作"ANSI C",或有时称为"C89"(为了区别C99)。
C90 [编辑]
在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会采纳为ISO/IEC 9899:1990。这个版本有时候称为C90。因此,C89和C90通常指同一种语言。
C99 [编辑]
在2000年三月,ANSI 采纳了 ISO/IEC 9899:1999 标准。这个标准通常指C99。
C11 [编辑]
在2011年12月,ANSI 采纳了 ISO/IEC 9899:2011 标准。这个标准通常即C11,它是C程序语言的现行标准。
主要编译器的支持 [编辑]
ANSI C现在被几乎所有广泛使用的编译器支持。现在多数C代码是在ANSI C基础上写的。任何仅仅使用标准C并且没有任何硬件依赖假设的代码实际上能保证在任何平台上用遵循C标准的编译器编译成功。如果没有这种预防措施,多数程序只能在一种特定的平台或特定的编译器上编译,例如,使用非标准库,例如图形用户界面库,或者有关编译器或平台特定的特性例如数据类型的确切大小和字节序.
选择编译 [编辑]
为了减轻K&R C和ANSI C标准,__STDC__("standard c")巨集可以被用来将代码分割为ANSI和K&R部分。
#if __STDC__ extern int getopt(int, char * const *, const char *); #else extern int getopt(); #endif
上面最好使用"#if __STDC__"而不是"#ifdef __STDC__",因为一些实现可能会把 __STDC__设置为0来表示不遵循ANSI C。"__STDC__"能处理任何没有被巨集替换或者值为0的标示符。因而即使巨集"__STDC__"没有定义来表示不遵循ANSI C,"__STDC__"仍然能像显示的那样工作。
在上面的例子,一个原型中使用了ANSI实现兼容的函数声明,而另一个使用了过时的非原形声明。它们在C99和C90中依旧是ANSI兼容的,但并不被鼓励使用。
支持 ANSI C 的编译器 [编辑]
- GCC
- Microsoft Visual C++ (C90. A few features of C99) (msvc doesn't support C99 at all. for example http://msdn.microsoft.com/en-us/library/zb1574zs%28VS.80%29.aspx)
- ARM RealView
外部链接 [编辑]
- ISO C working group
- Draft ANSI C Standard (ANSI X3J11/88-090) (May 13, 1988), Third Public Review
- Draft ANSI C Rationale (ANSI X3J11/88-151) (Nov 18, 1988)
- Schreiner, Axel-Tobias. Object oriented programming with ANSI-C. Hanser. Hanser. ISBN 3-446-17426-5.
- ISO/IEC 9899:1999 Programming Languages -- C. American National Standards Institute.
- ANSI Standards Action Vol. 36, #48. American National Standards Institute. 2005-12-02.