3

ac 文件中此构造的目的是什么?:

#define _TIMERC  
#include "timer.h"  
#undef _TIMERC  

我知道防止多次包含头文件的防护措施。但这似乎不是正在发生的事情。

谢谢!

4

6 回答 6

5

这里有一个场景来说明......

假设 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 获取其计数。

(我很抱歉回答我自己的问题,但问这个问题帮助我得到了这个启示。)

于 2008-12-02T16:10:23.620 回答
4

通常,一个库头文件会有多个选项,由宏定义启用和禁用。这将启用这样的选项。

更典型的是,通过配置您的构建系统以将 -D_TIMERC 添加(例如使用 gcc)-D_TIMERC到编译器命令行,这些设置在全局范围内。

于 2008-12-02T15:48:58.390 回答
2

我想知道它是否可能是这样的:

在这种情况下,头文件旨在允许在每个#include 之前建立具有不同定义的多个包含。

如果在 timer.h 中有一个用于微控制器中每个定时器的定时器 A、B 和 C 的代码块(中断代码)。在某些情况下,一个模块需要定时器 A,而另一个模块需要定时器 C。

于 2008-12-02T15:45:26.073 回答
1

我认为您的自我回答是正确的。包含的标头中很可能有条件的东西,“调用”文件知道它想要包含哪一组特定的条件“东西”。

它不一定与多个包含有关 - 它可能只是特殊情况,具体取决于“调用”上下文。

我不确定为什么要取消定义。我想不出我会混合和匹配的情况,所以不确定为什么需要取消定义。

于 2008-12-02T15:47:26.693 回答
0

冒着明显的风险,“timer.h”期望有 _TIMERC 而你的其余代码没有。

在一般情况下显然不是好的做法,但我在包含第三方代码时看到了类似的情况。当你有冲突的#defs时会变得讨厌......

于 2008-12-02T15:48:31.200 回答
0

作为记录,避免多个包含同一头文件的常见做法是将保护放在文件本身中,而不是依赖于一些外部定义...... ^_^

标题以:

#ifndef header_name_h
#define header_name_h

并以:

#endif

当然,def 样式可能会有所不同。

因此,在第一次包含时,我们经过#ifndef(尚未定义)并设置宏。在第二次包含时,如果有的话,我们只是跳转到文件末尾,什么都不包含。

于 2008-12-02T17:25:49.380 回答