核心结论 c 语言标识符就是程序员自己给变量 函数 数组 结构体 枚举 宏 标签起的名字,用来在代码里面标识对应的实体,简单理解就是代码里面所有自定义名称都属于标识符,它和关键字是两套东西,关键字是 C 语言本身预留的固定单词,不能拿来当自定义标识符,标识符命名必须遵守官方语法规则,只能由字母 下划线 数字组成,第一个字符不能是数字,区分大小写,不能和关键字重名。之所以要有标识符这套命名规则,是因为编译器需要依靠标识符识别每一个代码实体,区分变量名函数名结构体名,如果命名不符合规则,编译器无法解析,直接编译报错,同时区分大小写的设计,让 Sum sum SUM 被识别成三个完全不同的标识符,这个特性也是初学者经常踩坑的地方。C 标准没有规定标识符最大长度,但是编译器一般只识别前面部分字符,比如老编译器只识别前 31 个字符,长标识符后面字符会被忽略,跨平台开发的时候要留意这个限制。标识符按照用途可以分成用户自定义标识符 预定义标识符两大类,预定义标识符就是库函数名,比如 printf scanf strlen,这类名字虽然不是关键字,但是属于标准库已经使用的名称,虽然语法上允许拿来重命名,但是强烈不建议,会覆盖原有库函数,造成难以排查的 bug。
标识符分类清单
1 用户自定义标识符,程序员自己编写代码定义的名称,包含变量名 函数名 数组名 指针名 结构体标签名 枚举常量名 typedef 别名 goto 标签名 宏名
2 预定义标识符,C 标准库自带的名称,典型代表 printf scanf malloc free strlen strcpy sqrt pow,属于库函数或者宏,语法上不是关键字,但是不推荐占用
3 补充区分,关键字不属于标识符,比如 int void if for while switch return 这些,是系统保留字,禁止作为自定义标识符
标识符命名规则深度说明
清单
1 组成字符仅限英文字母大小写 下划线 阿拉伯数字,不允许中文 空格 特殊符号
2 首字符必须是字母或者下划线,不能以数字开头,比如 123var 是非法标识符,var123 是合法标识符
3 大小写敏感,Age age AGE 属于三个独立标识符
4 不能使用 C 语言关键字作为标识符,比如不能写 int int
5 标识符内部不能有空格,多个单词一般使用下划线分隔,比如 stu_score,也可以用驼峰写法 stuScore
6 以下划线开头的标识符,很多属于编译器和标准库内部保留命名,普通业务代码尽量不要用下划线开头,避免冲突
标识符与关键字预定义标识符对比表格
| 类别 | 是否可以自定义使用 | 举例 | 特点 |
|---|---|---|---|
| 用户自定义标识符 | 可以自由定义 | num func arr | 程序员自己命名 |
| 预定义标识符 | 语法允许但不推荐 | printf strlen | 标准库已经占用 |
| 关键字 | 禁止作为标识符 | int if while | C 语言语法保留字 |
编码注意事项
第一 不要把 printf 这类预定义标识符重新定义成变量或者函数,一旦覆盖,原来标准库函数就失效,编译或者运行出现异常
第二 虽然语法允许下划线开头标识符,但是双下划线开头,或者下划线加大写字母开头,是 C 标准明确保留给编译器实现使用,用户代码尽量避开
第三 中文标识符属于编译器扩展,不是标准 C,跨平台移植的时候其他编译器不支持,标准项目不要使用中文作为标识符
第四 标识符要有可读性,不要写 a b c 这种无意义短名字,规范命名可以提升代码维护性
第五 同一个作用域里面标识符不能重名,不同作用域可以同名,会发生作用域遮蔽,内层标识符会覆盖外层同名标识符
【常见问题】
问题 1 c 语言标识符有哪些,关键字是不是标识符
回答 1 c 语言标识符有哪些,关键字不属于标识符,关键字是 C 语言语法预留单词,不能拿来作为自定义标识符,标识符是用户或者库定义的名称,二者概念要区分开。
问题 2 c 语言标识符有哪些,数字能不能放在标识符开头
回答 2 c 语言标识符有哪些,数字不能放在标识符开头,首字符必须是字母或者下划线,数字只能放在标识符后面位置,比如 var1 是合法,1var 属于非法标识符。
问题 3 c 语言标识符有哪些,printf 算不算标识符
回答 3 c 语言标识符有哪些,printf 属于预定义标识符,是标准库函数名称,它不是关键字,语法上可以重命名,但是不建议覆盖,会破坏原有库函数功能。
问题 4 c 语言标识符有哪些,标识符区分大小写吗
回答 4 c 语言标识符有哪些,C 语言标识符严格区分大小写,Sum sum SUM 是三个不同标识符,编译器会识别成独立名称,写代码的时候大小写写错会报未定义错误。
【免责申明】
本文内容仅作为 c 语言标识符有哪些相关知识学习参考,不同编译器对长标识符识别长度 扩展命名支持存在差异,代码演示仅用于原理讲解,因命名违规或者覆盖预定义标识符造成编译运行异常,由使用者自行承担。


