Emp*_*pus 1 c preprocessor compile-time
假设我想确保始终使用不同的参数值(编译时)调用该函数。
理想的情况是这样可以编译:
enum en {
en_A,
en_B
};
...
foo(en_A);
Run Code Online (Sandbox Code Playgroud)
但这失败了:
enum en {
en_A,
en_B
};
...
foo(en_A);
...
foo(en_A);
Run Code Online (Sandbox Code Playgroud)
因此,我们应该只能调用某个函数 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(),并且每个此类调用都将被整个源代码库中的唯一编号替换,然后进行编译。因此,数字不是“要求程序员拥有唯一的数字”,而是自己生成的,这比检查某个数字是否已被所有同事使用过更容易编程。
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |