目的:#define,#include,#undef

时间:2008-12-02 15:42:23

标签: c embedded include

这个构造在c文件中的目的是什么?:

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

我知道防止多次包含头文件的警卫。但这似乎并没有发生。

谢谢!

6 个答案:

答案 0 :(得分: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_ader调用tick_count()并且lap_time从计时器C得到它的计数时,rpm_reader将从计时器A返回滴答计数。

(我很抱歉回答了我自己的问题,但是问这个问题有助于我得出这个启示。)

答案 1 :(得分:4)

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

通常通过将构建系统配置为(例如使用gcc) -D_TIMERC 到编译器命令行来设置全局范围。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

我认为你的自我回答是正确的。包含的标题中最有可能是条件内容,“调用”文件知道它想要包含哪些特定的条件“内容”。

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

我不确定为什么人们会取消定义。我想不出一个我会混合搭配的情况,所以不确定为什么需要取消定义。

答案 4 :(得分:0)

冒着说明显而易见的风险,“timer.h”希望有_TIMERC,其余的代码则没有。

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

答案 5 :(得分:0)

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

标题以:

开头
#ifndef header_name_h
#define header_name_h

并以:

结束
#endif

当然,def风格可能会有所不同。

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