
1. C语言标准1.1 C语言标准由谁维护C标准本身由ISO/IEC国际标准化组织/国际电工委员会维护1.2 从哪里获取标准文档获取C语言标准的官方文档主要有两种途径: 一是付费购买最终版的正式标准二是免费下载与最终版几乎无异的公开草案对于学习、参考或实现编译器免费的工作草案在技术上与最终标准差别极小是非常好的替代选择。C标准委员会的官方工作草案都会公开 第一种官方正式标准需付费 国际标准化组织 (ISO)可以直接从ISO的在线商店购买www.iso.ch 美国国家标准协会 (ANSI)可以通过ANSI购买电子版PDF或印刷版价格约18美元起 第二种免费公开草案与在线资源 C语言标准委员会网站 https://open-std.org/ 这是获取各版本草案的官方源头你可以在JTC1/SC22/WG14的页面上找到所有公开的草案和文档 第三种便捷的在线参考 如果你只是想快速查阅语言特性或库函数而不是阅读完整的标准文档https://cppreference.com/是一个非常好的选择。它由社区维护以更友好的方式组织和呈现了标准C语言和库的内容并会随着新标准更新1.3 为什么要设立一套标准如果没有标准每个编译器厂商都可以随意定义语法和库函数那么同一个程序可能在不同平台上产生完全不同的结果甚至无法编译。 反之标准让开发者能够编写出可移植的代码也确保了不同实现之间的基本一致性。1.4 . C语言标准规定了什么语法和词法关键字如if、while、int运算符优先级和结合性语句结构表达式语句、复合语句等预处理器指令#include、#define数据类型和大小基本类型char、int、float等的表示和最小取值范围例如int必须至少能表示-32767到32767但实际大小取决于实现语义和行为变量的作用域和生命周期未定义行为如数组越界、有符号整数溢出定义良好的行为如i和i的区别标准库函数头文件stdio.h、stdlib.h等中声明的函数、宏、类型函数的参数、返回值、副作用例如printf按格式化字符串输出程序入口和启动main函数的两种标准形式int main(void)和int main(int argc, char *argv[])返回值含义0表示成功非零表示失败可移植性约束定义了实现必须提供的宏如INT_MAX、CHAR_BIT规定了某些行为是由实现定义的如char是有符号还是无符号1.5 举一个C标准的例子假设我们写一个简单的程序#includestdio.hintmain(void){inta5;intb2;doubleresulta/b;// 整数除法结果被截断printf(a / b %f\n,result);return0;}语法必须包含#include stdio.h才能使用printf标准规定printf在该头文件中声明。int main(void)是标准允许的入口点形式之一。类型和运算a / b是两个int类型的除法执行整数除法结果截断为整数2因为 5/22.5小数部分丢弃。然后将整数2隐式转换为double赋值给result。标准明确规定了整数除法的截断规则向零取整C99 起明确。库函数行为printf(a / b %f\n, result)标准规定%f格式说明符对应一个double类型的参数输出时按照小数点后6位的默认精度打印浮点数。因此输出结果会是a / b 2.000000尽管数学上我们希望得到 2.5但整数除法的规则导致了这一结果。如果程序员期望浮点除法标准要求必须至少一个操作数为浮点类型例如a / (double)b。返回值return 0;表示程序成功结束。标准规定0或EXIT_SUCCESS表示成功其他值表示失败具体失败含义由实现定义。未涉及的行为标准没有规定变量a和b在内存中的存放位置栈、寄存器也没有规定printf的具体实现算法这些由编译器和库自行决定。如果我们在不同的C编译器如 GCC、Clang、MSVC上编译并运行这段代码输出结果必须是a / b 2.000000因为标准强制要求了整数除法的行为和printf的输出格式。这就是标准提供的可移植性保证。2. 标准C语言实现2.1 标准C库表格一览标准C库即标准C语言实现并不是由单一组织维护的具体的库实现则由社区、公司或开源项目负责实现名称维护者/主要贡献者适用平台代码获取方式glibc (GNU C Library)GNU项目由志愿者和公司如Red Hat、IBM等贡献Linux、Hurd等官网https://www.gnu.org/software/libc/Git仓库git clone git://sourceware.org/git/glibc.gitmuslmusl团队主要由Rich Felker维护Linux、兼容POSIX系统官网https://musl.libc.org/Git仓库git clone git://git.musl-libc.org/musluClibc-nguClibc-ng团队社区维护基于uClibc嵌入式Linux官网https://uclibc-ng.org/Git仓库git clone https://git.uclibc-ng.org/git/uclibc-ng.gitdietlibcFelix von Leitner及社区贡献Linux官网https://www.fefe.de/dietlibc/下载页面直接获取源码BionicGoogleAndroid开源项目Android官网https://android.googlesource.com/platform/bionic/通过repo工具或直接浏览GitNewlibRed Hat及社区贡献嵌入式系统如ARM、RISC-V等官网https://sourceware.org/newlib/Git仓库git clone git://sourceware.org/git/newlib-cygwin.gitFreeBSD libcFreeBSD项目FreeBSD、其他BSD衍生系统官网https://cgit.freedesktop.org/~alkino/libc/注意实际FreeBSD源码在https://cgit.freebsd.org/src/tree/lib/libc可通过FreeBSD源码仓库获取svn checkout svn://svn.freebsd.org/base/head/lib/libc或 Git镜像Microsoft C运行时库MicrosoftWindows源代码不公开但可下载Windows SDK获取头文件和库部分开源组件如Universal CRT在GitHubhttps://github.com/microsoft/STL包含部分CRT源码Apple LibcApplemacOS、iOS开源组件可在Apple开源网站获取https://opensource.apple.com/source/Libc/