我正在开发一个专门为一种嵌入式处理器编写的“C”代码库。我已经为LED,GPIO线和ADC(使用结构等)编写了通用的“伪面向对象”代码。我还编写了大量代码,以硬件/目标不可知的方式利用这些“对象”。
我们现在将另一种处理器类型混合在一起,我想保留当前的代码结构,以便我仍然可以使用更高级别的库。但是,我需要为低级代码(LED,GPIO,ADC)提供不同的实现。
我知道#include in .C文件通常被低估,但在这种情况下,它是否合适?例如:
// led.c
#ifdef TARGET_AVR
#include "led_avr.c"
#elseifdef TARGET_PIC
#include "led_pic.c"
#else
#error "Unspecified Target"
#endif
如果这不合适,什么是更好的实施?
谢谢!
答案 0 :(得分:3)
由于链接器不关心源文件的名称实际是什么(它只关心导出的符号),因此您可以更改每个目标的链接器命令行以命名相应的实现模块(led_avr.c
或led_pic.c
)。
管理多个平台源文件的常用方法是将每组平台实现文件放在他们自己的目录中,这样您就可以avr/led.c
和pic/led.c
(以及avr/gpio.c
和{ {1}}等。)
答案 1 :(得分:2)
很好。您可以使用其他技巧,例如:
#ifdef PROC1
#define MULTI_CPU(a,b) (a)
#else
#define MULTI_CPU(a,b) (b)
#endif
答案 2 :(得分:0)
更常见的方法是改变构建系统(无论是什么)来编译或不编译那些特定的C文件,而不是包含C文件。