c - 确保始终使用不同的参数调用接受枚举的 C 函数(编译时)
问题描述
假设我想确保始终使用不同的参数值(编译时)调用该函数。
理想的情况是这样编译:
enum en {
en_A,
en_B
};
...
foo(en_A);
但这失败了:
enum en {
en_A,
en_B
};
...
foo(en_A);
...
foo(en_A);
因此,我们应该只能调用某个函数 foo(en_A) 一次(对于 foo(en_B) 也是如此)。
不太可取但也可以接受的是定义 foo_en_A、foo_en_B 并确保它们中的每一个只被调用一次。
是否可以在 C 中执行类似编译时的操作?
解决方案
是否可以在 C 中执行类似编译时的操作?
不,这是不可能的。不仅 C 编程语言缺乏反射——无法检查自身,而且 C 编程语言一次编译一个“翻译单元”。虽然编译器扩展部分可能在一个 TU 中实现该检查,但您必须提供一个特殊的链接器或链接器插件来跨多个 TU 实现它。
要在编译时做你想做的事,你必须使用 C 源代码本身之外的外部工具。这些工具可以处理生成的程序、检查程序集,或者可以处理 C 源代码本身。
(您在问 XY 问题)。
确保日志库的用户永远不会使调用模棱两可(例如,从两个不同的地方设置相同的错误),以便可以清楚地跟踪产生错误的代码中的位置
要做到这一点,只需记录__FILE__
并__LINE__
雇用理智的程序员,他们永远不会将非唯一的日志消息放在同一行,或者用相同的路径编译不同的文件。
无论如何,还有另一种解决问题的方法。不需要程序员在整个代码库中键入唯一的数字,只需生成数字即可。我曾经在一个裸机小型嵌入式系统中工作,该系统的通信能力非常低,大约为每小时字节数。一个用 shell 编写的工具awk
会扫描整个代码库中的字符串UNIQUE()
,并且每个这样的调用都将被整个源代码库中的唯一编号替换,然后进行编译。因此,数字不是“要求程序员有唯一的数字”,而是自己生成的,这比检查某个数字是否已被所有同事使用要容易得多。
推荐阅读
- android - java.lang.IllegalArgumentException: 南纬超过北纬 (23.029011581089936 > 23.0060917)
- node.js - 自动迁移创建数据库名称“未定义”,在 loopback-connector-cassandra 中的“未定义”数据库中创建表
- javascript - 卸载或卸载扩展程序时,Chrome Native Messaging 退出 NodeJS 主机
- sql - 在员工领取高薪的部门工作的员工姓名
- flutter - 颤振:处理 File.path 空/空
- gemfire - Gemfire 9.8.4 的主机要求
- c# - .net如何在zipfile中包含目录和文件关系
- ngxs - ngxs 实验室 immer 要求完整状态?
- sql - 如何查找 SQL 数据库信息
- php - 如何在 php 中动态设计表格,在 td 和数据之后有 3 行