部分宏重新定义

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 解析器。