部分宏重新定义

时间:2019-07-11 21:04:45

标签: c macros embedded porting

我正在尝试将驱动程序移植到新的应用程序。我正在寻找链接定义的有效方法。

示例:

someCommonHeader.h

#define abc_1234 0x01 
#define abc_5678 0x02 
#define abc_9012 0x03 

oldApplication.c

U8 x1,x2,x3; 

x1 = abc_1234 ; 
x2 = abc_5678 ;
x3 = abc_9012 ;

在新应用程序中,“ abc_”替换为“ xyz_”

newApplication.c

x1 = xyx_1234; 
x2 = xyz_5678; 
x3 = xyz_9012; 

我当然可以做类似的事情:

compatibilityHeader.h

#define xyx_1234 abc_1234  
#define xyz_5678 abc_5678 
#define xyz_9012 abc_9012

但是,我正在寻找是否还有其他方法。更具体地说,我希望编译器将“ xyz_”替换为“ abc_”引用。这可能吗?

详细信息:

硬件:嵌入式系统/微控制器 编译器:gcc 编程语言:C

任何建议/参考都值得赞赏。

3 个答案:

答案 0 :(得分:3)

  

更具体地说,我希望编译器将“ xyz_”替换为“ abc_”引用。这可能吗?

否。

我们可以通过观察您在预处理器中需要它来进行某种程度的简化,因为它是您要操作的宏名,并且这些宏名在预处理期间已解析。随着范围的缩小,我们有理由简单地阅读标准的6.10节,以确认尽管存在将多个令牌组合成一个令牌的机制,但没有将令牌分开或在令牌部分上运行的机制。

取决于这些令牌的出现次数以及存在的其他标识符,仅进行文本搜索和替换并进行后续审核可能是可行的。也可以通过文本处理或其他工具提取旧的宏定义,并以编程方式从中生成兼容性宏定义(来源:@Jean-FrançoisFabre)。

答案 1 :(得分:0)

在进行新定义之前,您需要#undef旧宏

#undef abc_xyz
#define abc_xyz xyz_xyz

(填充点)

答案 2 :(得分:0)

假设我正确地了解了您要执行的操作,则可以使用预处理器替换字符串的一部分。因此,您可以执行以下操作,但这很丑陋:

#define OLD_APPLICATION       // Define if you need the old application

#ifdef OLD_APPLICATION        
  #define ABC_OR_XYZ    abc
#else
  #define ABC_OR_XYZ    xyz
#endif

现在,代码中的所有位置都将所有标签替换为它们的等效标签,例如:

xyx_1234    ->    ABC_OR_XYZ##_1234
xyz_5678    ->    ABC_OR_XYZ##_5678
xyz_9012    ->    ABC_OR_XYZ##_9012
abc_1234    ->    ABC_OR_XYZ##_1234
abc_5678    ->    ABC_OR_XYZ##_5678
abc_9012    ->    ABC_OR_XYZ##_9012

然后预处理器将为您处理字符串替换。
请注意,##用于连接字符串。

另一种方法可能是让您编写自己的预构建解析器。