我正在尝试将驱动程序移植到新的应用程序。我正在寻找链接定义的有效方法。
示例:
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
任何建议/参考都值得赞赏。
答案 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
然后预处理器将为您处理字符串替换。
请注意,##用于连接字符串。
另一种方法可能是让您编写自己的预构建解析器。