我正在为微控制器编写一些库,我已经根据它们的功能分组了这些库。例如,我adc.h
配置模拟输入测量,uart.h
和i2c.h
用于数字通信等。
其中一些库需要有关CPU速度的信息,所以我已经定义了一个宏语句
#define FCY 30000000UL
在需要此信息的所有头文件中。我的问题是,我可以以某种方式对这些头文件进行编程,使FCY
宏仅在头文件中“声明”,但在其外部定义,例如,在main.c
文件中?问题是,当我改变CPU速度(频率)时,我必须更新所有这些容易出错的FCY
宏语句。
答案 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.c
,main.c
和static
答案 2 :(得分:0)
好吧,也许解决方法是让FCY定义依赖于另一个存储SPEED信息的宏定义,例如:
#define SPEED 345
和其他文件
#define FCY 30000##SPEED##UL
这会在代码中FCY
替换/展开30000345UL
,因此您可以单独更改SPEED
宏和FCY
宏。
如果要应用某个公式,您可以执行以下操作:
#define SPEED 345
并在cpu文件中:
#define FCY (300000000UL | (SPEED))