未保留的名称

Unreserved names

C语言有一套彻底的保留关键字。然而,有一组更大的标识符是保留或半保留的,至少强烈不推荐使用它们,因为它们被标准库或各种系统头文件使用,或者将来可能会这样使用,等等;这里有一份全面但不详尽的清单:https://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html

此类名称的集合太大,无法一一列举。

从使用C作为编译目标的角度来看,我正在寻找相反的方向:一组我可以生成的名称,保证是不是 保留,免费供应用程序使用。

很明显,只要在每个名称前加上一个 UUID 就可以有效地满足这个要求,但是还有一个额外的要求,即生成的代码要尽可能易于目视调试,因此命名空间应该尽可能尽可能简单,例如如果所有的名字都有一个共同的前缀,那个前缀应该尽可能短。

描述一组保证或极有可能无法免费供应用程序使用的名称的特征的最简单方法是什么?例如,使用带有 x_ 或类似前缀的任意名称是否安全?

大多数 C 库提供 feature-selection 宏,允许您指定您正在使用的接口版本。如果在 Linux 或 UNIX 上包含任何系统 header 之前设置 _POSIX_C_SOURCE_XOPEN_SOURCE,您的系统库将不会声明未来版本的 UNIX 可能定义的任何标识符。 (理论上,单独设置其中一个就足够了,但是同时设置两者是一种很好的防御性编码,因为这将防止其他人不一致地设置一个或另一个。)On Windows, 你会声明 NTDDI_VERSION_WIN32_WINNT.

C标准库只提供feature-test宏,不是让你选择接口的宏,但是编译器支持-std=c20这样的flag,你应该在你的构建脚本中设置它。这应该会禁用将来添加到语言中的任何新关键字或标识符。

如果您依赖于库的特定版本,并且担心对其 header 文件的更改会破坏您的代码,您可以将 headers 的副本(以及绝对确定,库本身)在你的项目树中。如果库是 open-source,请记下您使用的版本应该让其他人下载正确的版本。否则,您将受到其维护者的摆布。

不要声明_BSD_SOURCE_GNU_SOURCE,如果这是您的顾虑! Linuxheader没有glibc绑定的,比如<linux/module.h>,一般没有这种版本控制。

有些语言对此有更强大的解决方案,例如 cabalstack 用于 Haskell 或 cargo 用于 Rust。