头语文件中使用的宏语句,但在其外部定义

时间:2017-02-11 22:36:39

标签: c macros header

我正在为微控制器编写一些库,我已经根据它们的功能分组了这些库。例如,我adc.h配置模拟输入测量,uart.hi2c.h用于数字通信等。

其中一些库需要有关CPU速度的信息,所以我已经定义了一个宏语句

#define FCY 30000000UL

在需要此信息的所有头文件中。我的问题是,我可以以某种方式对这些头文件进行编程,使FCY宏仅在头文件中“声明”,但在其外部定义,例如,在main.c文件中?问题是,当我改变CPU速度(频率)时,我必须更新所有这些容易出错的FCY宏语句。

3 个答案:

答案 0 :(得分:1)

我建议提供一个单独的头文件,例如hardware_constants.h,用于在几个.h文件或c文件中需要相同的内容。在需要的地方加入hardware_constants.h,而不是(重新)多次定义相同的事物。

你甚至可以让调用编译器的人提供这些定义,例如:在命令行,生成文件或IDE的项目设置中。

并且一些IDE提供在每个翻译单元之前自动包含的标题。例如,在XCode项目中,您可以将公共#define ... - 语句放在名为PrefixHeader.pch的文件中,并且这些定义将在每个源代码文件中隐式提供。

答案 1 :(得分:1)

不要在任何source- / header-file中定义FCY,而只是在调用编译器时。

对于GCC,您可以使用-D选项执行此操作:

gcc src1.c src2.c main.c -o main -DFCY=30000000UL

这样预处理器"看到" FCY #define通过选项-D对所有三个文件的方式src1.c src2.cmain.cstatic

答案 2 :(得分:0)

好吧,也许解决方法是让FCY定义依赖于另一个存储SPEED信息的宏定义,例如:

#define SPEED 345

和其他文件

#define FCY 30000##SPEED##UL

这会在代码中FCY替换/展开30000345UL,因此您可以单独更改SPEED宏和FCY宏。

如果要应用某个公式,您可以执行以下操作:

#define SPEED 345

并在cpu文件中:

#define FCY  (300000000UL | (SPEED))