C 参考手册
- C 语言
- C 的历史
- 基本概念
- 表达式
- 声明
- 初始化
- 函数
- 语句
- 静态断言
- 字符常量
- 函数声明
- 函数定义
- 转义序列
- 翻译阶段
- 标识符
- 作用域
- 生存期
- 查找与命名空间
- ASCII 码表
- 类型
- 遵从性
- 算术类型
- restrict 类型限定符
- 类型
- 对象与对齐
- 主函数
- 未定义行为
- 内存模型
- if 语句
- switch 语句
- for 循环
- while 循环
- do-while 循环
- continue语句
- break 语句
- goto语句
- return 语句
- 值类别
- 求值顺序
- 整数常量
- 浮点常量
- 字符串字面量
- 复合字面量
- 常量表达式
- 隐式转换
- 成员访问运算符
- 逻辑运算符
- 比较运算符
- 算术运算符
- 赋值运算符
- 自增/自减运算符
- 其他运算符
- sizeof 运算符
- _Alignof 运算符
- 转型运算符
- C 运算符优先级
- 泛型选择
- 标量初始化
- 数组初始化
- 结构体与联合体初始化
- 指针声明
- 数组声明
- 枚举
- 存储类指定符
- const 类型限定符
- volatile 类型限定符
- 结构体声明
- 联合体声明
- 位域
- _Alignas
- typedef 声明
- 原子类型
- 外部及试探性定义
- inline 函数指定符
- _Noreturn 函数指定符
- 变长参数
- 内联汇编
- 可分析性
- 替用运算符及记号
- C 关键词
- 预处理器
- C 标准库头文件
- 类型支持
- 程序支持工具
- 变参数函数
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 算法
- 数值
- 文件输入/输出
- 本地化支持
- 原子操作库
- 线程支持库
- 实验性 C 标准库
- 有用的资源
- 符号索引
- 注释
标识符
标识符是数字、下划线、小写及大写拉丁字母和以 \u
及 \U
转义记号指定的 Unicode 字符 (C99 起)的任意长度序列。合法的标识符必须以非数字字符(拉丁字母、下划线或 Unicode 非数字字符 (C99 起))开始。标识符大小写有别(小写和大写字母不同)。
是否在标识符中允许未处理(未转义)的 Unicode 字符是实现定义的: char *\U0001f431 = "cat"; // 受支持 char *???? = "cat"; // 实现定义( Clang 可用,但 GCC 不可) |
(C99 起) |
标识符能指代下列类型的实体:
宏名或宏形参名以外的每个标识符都拥有作用域,属于命名空间,并且可以拥有链接。相同的标识符可以在程序的相异点指代相异实体,或若实体在不同的命名空间中,则可在相同点指代相异实体。
保留标识符
下列标识符被保留,而且不可在程序中声明(这么做会引起未定义行为):
1) 作为关键词的标识符不能用于其他目的。具体而言,不允许 #define 或 #undef 等同于关键词的标识符。
2) 所有以一个下划线开始的外部标识符。
3) 所有以一个下划线后随一个大写字母或另一下划线开始的标识符(这些保留标识符允许库使用大量幕后的非外部宏及函数)。
4) 标准库所定义的所有外部标识符(在有宿主环境中)。这表示不允许用户提供的外部名称匹配任何库名称,即使是声明等同于库函数的函数也不允许。
5) 声明为标准库为未来使用保留的标识符,即
- 函数名
- <complex.h> 中,
cerf
、cerfc
、cexp2
、cexpm1
、clog10
、clog1p
、clog2
、clgamma
、ctgamma
及其 -f 和 -l 后缀变体 - <ctype.h> 和 <wctype.h> 中,以
is
或to
后随一个小写字母开始者 - <stdlib.h> 中,以
str
后随一个小写字母开始者 - <string.h> 中,以
str
、mem
或wcs
后随一个小写字母开始者 - <wchar.h> 中,以
wcs
后随一个小写字母开始者 - <stdatomic.h> 中,以
atomic_
后随一个小写字母开始者 - <threads.h> 中,以
cnd_
、mtx_
、thrd_
或tss_
后随一个小写字母开始者
- <complex.h> 中,
- typedef 名
- <stdint.h> 中,以
int
或uint
开始并以_t
结束者 - <stdatomic.h> 中,以
atomic_
或memory_
后随一个小写字母开始者 - <threads.h> 中,以
cnd_
、mtx_
、thrd_
或tss_
后随一个小写字母开始者
- <stdint.h> 中,以
- 宏名
- <errno.h> 中,以
E
后随一个数字或大写字母开始者 - <fenv.h> 中,以
FE_
后随一个大写字母开始者 - <stdint.h> 中,以
INT
或UINT
开始并以_MAX
、_MIN
或_C
结束者 - <stdint.h> 中,以
PRI
或SCN
后随小写字母或字母X
开始者 - <locale.h> 中,以
LC_
后随一个大写字母开始者 - <signal.h> 中,以
SIG
或SIG_
后随一个大写字母开始者 - <time.h> 中,以
TIME_
后随一个大写字母开始者 - <stdatomic.h> 中,以
ATOMIC_
后随一个大写字母开始者
- <errno.h> 中,以
- 枚举常量
- <stdatomic.h> 中,以
memory_order_
后随一个小写字母开始者 - <threads.h> 中,以
cnd_
、mtx_
、thrd_
或tss_
后随一个小写字母开始者
- <stdatomic.h> 中,以
所有其他标识符均可用,无需担心从一个编译器和库移动程序到另一个时有不期待的冲突。
注意: C++ 中,在任何位置有双下划线的标识符都受保留; C 中,只有以双下划线开始的标识符受保留。
翻译限制
尽管标识符长度上无特定的限制,一些早期编译器还是在标识符中的有效起始字符数上有限制,而链接器在带外部链接的名称上加上了更严格的限制。 C 要求任何服从标准的实现支持下列极限:
|
(C99 前) |
|
(C99 起) |
引用
- C11 standard (ISO/IEC 9899:2011):
- 5.2.4.1 Translation limits (p: 25-26)
- 6.4.2 Identifiers (p: 59-60)
- 6.10.8 Predefined macro names (p: 175-176)
- 6.11.9 Predefined macro names (p: 179)
- 7.31 Future library directions (p: 455-457)
- K.3.1.2 Reserved identifiers (p: 584)
- C99 standard (ISO/IEC 9899:1999):
- 5.2.4.1 Translation limits (p: 20-21)
- 6.4.2 Identifiers (p: 51-52)
- 6.10.8 Predefined macro names (p: 160-161)
- 6.11.9 Predefined macro names (p: 163)
- 7.26 Future library directions (p: 401-402)
- C89/C90 standard (ISO/IEC 9899:1990):
- 2.2.4.1 Translation limits
- 3.1.2 Identifiers
- 3.8.8 Predefined macro names