ac 文件中此构造的目的是什么?:
#define _TIMERC
#include "timer.h"
#undef _TIMERC
我知道防止多次包含头文件的防护措施。但这似乎不是正在发生的事情。
谢谢!
这里有一个场景来说明......
假设 timer.h 提供了一个宏 tick_count() ,它返回发生的定时器中断的数量。
一个模块 (rpm_reader.h) 使用计时器 A 进行间隔计时:
#define _TIMERA
#include "timer.h"
#undef _TIMERA
在另一个模块 (lap_time.h) 中使用计时器 C 进行间隔计时
#define _TIMERC
#include "timer.h"
#undef _TIMERC
rpm_reader 会在调用 tick_count() 时从计时器 A 返回滴答计数,而 lap_time 将从计时器 C 获取其计数。
(我很抱歉回答我自己的问题,但问这个问题帮助我得到了这个启示。)
通常,一个库头文件会有多个选项,由宏定义启用和禁用。这将启用这样的选项。
更典型的是,通过配置您的构建系统以将 -D_TIMERC 添加(例如使用 gcc)-D_TIMERC到编译器命令行,这些设置在全局范围内。
我想知道它是否可能是这样的:
在这种情况下,头文件旨在允许在每个#include 之前建立具有不同定义的多个包含。
如果在 timer.h 中有一个用于微控制器中每个定时器的定时器 A、B 和 C 的代码块(中断代码)。在某些情况下,一个模块需要定时器 A,而另一个模块需要定时器 C。
我认为您的自我回答是正确的。包含的标头中很可能有条件的东西,“调用”文件知道它想要包含哪一组特定的条件“东西”。
它不一定与多个包含有关 - 它可能只是特殊情况,具体取决于“调用”上下文。
我不确定为什么要取消定义。我想不出我会混合和匹配的情况,所以不确定为什么需要取消定义。
冒着明显的风险,“timer.h”期望有 _TIMERC 而你的其余代码没有。
在一般情况下显然不是好的做法,但我在包含第三方代码时看到了类似的情况。当你有冲突的#defs时会变得讨厌......
作为记录,避免多个包含同一头文件的常见做法是将保护放在文件本身中,而不是依赖于一些外部定义...... ^_^
标题以:
#ifndef header_name_h
#define header_name_h
并以:
#endif
当然,def 样式可能会有所不同。
因此,在第一次包含时,我们经过#ifndef(尚未定义)并设置宏。在第二次包含时,如果有的话,我们只是跳转到文件末尾,什么都不包含。