部分宏重新定义
Partial macro redefinition
我正在尝试将驱动程序移植到新应用程序。我正在寻找 link 定义的有效方法。
示例:
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_" 引用。这可能吗?
详情:
HW:嵌入式系统/微控制器
编译器:gcc
编程语言:C
如有任何建议/参考,我们将不胜感激。
More specifically, I want the compiler to replace "xyz_" to "abc_" references. Is this possible?
没有
我们可以通过观察您在预处理器中需要它来进行一些简化,因为它是您要操作的宏名称,并且这些名称在预处理期间已解析。随着范围的缩小,有理由简单地通读标准的第 6.10 节以确认虽然存在将多个令牌组合成一个的机制,但没有将令牌分开或对令牌部分进行操作的机制。
根据这些标记的出现次数以及存在的其他标识符,仅执行文本搜索和替换并进行后续审查可能是可行的。也可以通过 text-processing 或其他工具提取旧的宏定义,并以编程方式从中生成 compatibility-macro 定义(来源:@Jean-FrançoisFabre)。
你需要#undef
你的旧宏才能定义新的
#undef abc_xyz
#define abc_xyz xyz_xyz
(填点)
假设我正确理解了您的要求,您可以使用预处理器替换字符串的一部分。所以你可以做这样的事情,但它很丑陋:
#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
然后预处理器将为您处理字符串替换。
请注意,## 用于连接字符串。
另一种方法是您编写自己的 pre-build 解析器。
我正在尝试将驱动程序移植到新应用程序。我正在寻找 link 定义的有效方法。
示例:
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_" 引用。这可能吗?
详情:
HW:嵌入式系统/微控制器 编译器:gcc 编程语言:C
如有任何建议/参考,我们将不胜感激。
More specifically, I want the compiler to replace "xyz_" to "abc_" references. Is this possible?
没有
我们可以通过观察您在预处理器中需要它来进行一些简化,因为它是您要操作的宏名称,并且这些名称在预处理期间已解析。随着范围的缩小,有理由简单地通读标准的第 6.10 节以确认虽然存在将多个令牌组合成一个的机制,但没有将令牌分开或对令牌部分进行操作的机制。
根据这些标记的出现次数以及存在的其他标识符,仅执行文本搜索和替换并进行后续审查可能是可行的。也可以通过 text-processing 或其他工具提取旧的宏定义,并以编程方式从中生成 compatibility-macro 定义(来源:@Jean-FrançoisFabre)。
你需要#undef
你的旧宏才能定义新的
#undef abc_xyz
#define abc_xyz xyz_xyz
(填点)
假设我正确理解了您的要求,您可以使用预处理器替换字符串的一部分。所以你可以做这样的事情,但它很丑陋:
#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
然后预处理器将为您处理字符串替换。
请注意,## 用于连接字符串。
另一种方法是您编写自己的 pre-build 解析器。