在 C 标识符中使用下划线的规则是什么?

ein*_*ica 1 c syntax reserved-words language-lawyer

在 C(和其他语言)中,对变量和函数的名称使用前缀和后缀是很常见的。_x特别是,人们偶尔会在“正确的”标识符(例如_y变量等)之前或之后看到下划线的使用。_print但是,还有一种常识是避免以下划线开头的名称,以免与 C 标准发生冲突库实施。

那么,什么地方、什么地方可以使用下划线呢?

ein*_*ica 5

足够好的经验法则

不要以下划线开头标识符。

就是这样。您可能仍然与某些特定于文件的定义发生冲突(见下文),但这些只会给您一条错误消息,您可以处理该消息。

安全、稍有限制、经验法则

不要以以下方式开始您的标识符:

  • 一个下划线。
  • 任何 1-3 个字母前缀,后跟下划线,这不是正确的单词(例如a_, st_
  • memory_或者atomic_

并且不要以_MIN或结尾您的标识符_MAX

这些规则禁止的内容比实际保留的要多一些,但相对容易记住。

更详细的规则

这是基于C2x 标准草案(因此涵盖了先前标准的保留)和glibc 文档

不要使用:

  • 前缀__(两个下划线)。
  • 由一个下划线后跟一个大写字母组成的前缀(例如_D)。
  • 对于在文件范围内可见的标识符 - 前缀_.
  • 以下前缀带有下划线,后跟小写字母:atomic_, memory_, memory_order_, cnd_, mtx_, thrd_, tss_
  • 以下前缀带有下划线,后跟大写字母:LC_, SIG_, ATOMIC,TIME_
  • 后缀_t(这是 POSIX 限制;对于 C 语言本身,您可以使用此后缀,除非您的标识符以int或开头uint

其他限制是针对每个库头文件的,而不是通用的(其中一些是 POSIX 限制):

如果您使用头文件... 您不能将标识符与...一起使用
dirent.h 字首d_
fcntl.h 前缀l_, F_, O_, 和S_
grp.h 字首gr_
limits.h 后缀_MAX(也可能是_MIN
pwd.h 字首pw_
signal.h 前缀sa_SA_
sys/stat.h 前缀 st_S_
sys/times.h 字首tms_
termios.h 字首c_

当然,还有不涉及下划线的附加限制。