c - 未保留的名称
问题描述
C 语言有一组完全保留的关键字。但是,有一组更大的标识符是保留或半保留的,至少强烈不建议使用它们,因为它们被标准库或各种系统头文件使用,或者将来可能会这样使用等;这里有一个全面但不详尽的列表:https ://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html
这些名称的集合太大而无法枚举。
从使用 C 作为编译目标的角度来看,我正在寻找相反的情况:我可以生成一组名称,保证不保留,免费供应用程序使用。
显然,只要在每个名称前加上一个 UUID 就可以有效地满足这个要求,但是还有一个额外的要求是生成的代码尽可能地适合眼球调试,所以命名空间应该尽可能简单,例如如果所有名称都具有共同的前缀,则该前缀应尽可能短。
描述一组保证或极有可能无法免费供应用程序使用的名称的最简单方法是什么?例如,使用带有x_
或类似前缀的任意名称是否安全?
解决方案
大多数 C 库都提供功能选择宏,允许您指定正在使用的接口版本。如果您在 Linux 或 UNIX 上设置_POSIX_C_SOURCE
和_XOPEN_SOURCE
之前包含任何系统头文件,您的系统库将不会声明未来版本的 UNIX 可能定义的任何标识符。(理论上,单独设置一个就足够了,但是同时设置两个都是很好的防御性编码,因为这将防止一个或另一个被其他人不一致地设置。) 在 Windows 上,您将声明NTDDI_VERSION
and _WIN32_WINNT
.
C 标准库仅提供功能测试宏,而不是让您选择接口的宏,但编译器支持标志,例如-std=c20
,您应该在构建脚本中设置它。这应该禁用将来添加到语言中的任何新关键字或标识符。
如果您依赖于特定版本的库,并且担心对其头文件的更改可能会破坏您的代码,您可以将头文件的副本(并且绝对可以肯定,库本身)放在项目树中。如果库是开源的,请记下您使用的版本应该让其他人下载正确的版本。否则,您将受其维护者的摆布。
不要申报,或者如果这对您来说是一个问题!没有 glibc 绑定的 Linux 头文件,例如,通常没有这种版本控制。_BSD_SOURCE
_GNU_SOURCE
<linux/module.h>
一些语言对此有更强大的解决方案,例如cabal
Haskellstack
或cargo
Rust。
推荐阅读
- c# - 如何使用 .Net Framework 通过 C# 获取 Windows 注册表项的真正价值?
- javascript - 聚合物 3 中未定义的工厂全局变量
- javascript - Javascript 模块包含在量角器配置 js 文件中
- javascript - 传单层上的多个即时过滤
- c# - 从 xaml 代码创建对象并识别它们
- javascript - 从数组中删除特定元素
- angular - 获取加载指示器的 http post 请求进度
- r - 仅当数字大于阈值时如何绘制 ggplots 六边形
- python-3.x - 我正在尝试使这个简单的套接字“ddos”多线程,但它没有任何回报
- php - 我如何将 spatie/laravel-backup 与 Postgres DB 集成?