首页 > 解决方案 > 未保留的名称

问题描述

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

这些名称的集合太大而无法枚举。

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

显然,只要在每个名称前加上一个 UUID 就可以有效地满足这个要求,但是还有一个额外的要求是生成的代码尽可能地适合眼球调试,所以命名空间应该尽可能简单,例如如果所有名称都具有共同的前缀,则该前缀应尽可能短。

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

标签: cnaming-conventionsnaming

解决方案


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

C 标准库仅提供功能测试宏,而不是让您选择接口的宏,但编译器支持标志,例如-std=c20,您应该在构建脚本中设置它。这应该禁用将来添加到语言中的任何新关键字或标识符。

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

不要申报,或者如果这您来说是一个问题!没有 glibc 绑定的 Linux 头文件,例如,通常没有这种版本控制。_BSD_SOURCE_GNU_SOURCE<linux/module.h>

一些语言对此有更强大的解决方案,例如cabalHaskellstackcargoRust。


推荐阅读