首页 > 解决方案 > 确保始终使用不同的参数调用接受枚举的 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 中执行类似编译时的操作?

标签: cpreprocessorcompile-time

解决方案


是否可以在 C 中执行类似编译时的操作?

不,这是不可能的。不仅 C 编程语言缺乏反射——无法检查自身,而且 C 编程语言一次编译一个“翻译单元”。虽然编译器扩展部分可能在一个 TU 中实现该检查,但您必须提供一个特殊的链接器或链接器插件来跨多个 TU 实现它。

要在编译时做你想做的事,你必须使用 C 源代码本身之外的外部工具。这些工具可以处理生成的程序、检查程序集,或者可以处理 C 源代码本身。

(您在问 XY 问题)。

确保日志库的用户永远不会使调用模棱两可(例如,从两个不同的地方设置相同的错误),以便可以清楚地跟踪产生错误的代码中的位置

要做到这一点,只需记录__FILE____LINE__雇用理智的程序员,他们永远不会将非唯一的日志消息放在同一行,或者用相同的路径编译不同的文件。

无论如何,还有另一种解决问题的方法。不需要程序员在整个代码库中键入唯一的数字,只需生成数字即可。我曾经在一个裸机小型嵌入式系统中工作,该系统的通信能力非常低,大约为每小时字节数。一个用 shell 编写的工具awk会扫描整个代码库中的字符串UNIQUE(),并且每个这样的调用都将被整个源代码库中的唯一编号替换,然后进行编译。因此,数字不是“要求程序员有唯一的数字”,而是自己生成的,这比检查某个数字是否已被所有同事使用要容易得多。


推荐阅读