如何“欺骗” C预处理器接受功能/变量等的任何部分作为标记?

问题描述 投票:-1回答:1

首先,在mods将其标记为重复之前,请确保您已阅读完此问题。

首先,请注意,我正在尝试修改其他人编写的现有代码,因此其他类似问题的答案很可能不适用,因为他们可能会在考虑面向宏函数的编码思想的情况下启动代码,使杂技的预处理变得容易得多,对我来说不是这种情况。

所以这就是我想做的,假设我有1个函数和1个变量:

void Foo1(void);
int Foo1 = 0;

我想把它们变成:

void FOO1(void);
int FOO1 = 0;

现在众所周知,正在做

#define Foo FOO 

将不起作用,因为C预处理器不会将Foo1中的Foo视为单个令牌,而是将Foo1(整个Foo1视为令牌)。

因此,我需要以某种方式“欺骗” C预处理器,使其认为Foo是令牌,然后对其进行处理。

我尝试过:

#define a_random_thing Foo
#define Foo FOO

天真的相信预处理器在扩展后会认为“ Foo”是“ a_random_thing”的乘积,然后对“ Foo”执行另一轮扩展。

可悲的是,显然没有用。

那我该怎么办?

我正在处理的代码是一个更新的库,对大量的变量名和函数名进行了稍微的修改,足以使我产生100多个编译错误,这对他们来说非常周到。我正在尝试使其向后兼容。

如果无法完成我要完成的任务,请也告诉我,谢谢!

c macros c-preprocessor
1个回答
0
投票

除非您继续定义foo1,foo2,foo3 ...,否则这实际上是不可能的。

您根本无法将foo1拆分为两个不同的预处理器令牌,这是可变解决问题所必需的。

您可以执行的最接近的操作是#define foo(n) FOO##n,并将其称为foo(1)以获得FOO1

...或者您可能只需要在文本编辑器中进行搜索和替换即可。

© www.soinside.com 2019 - 2024. All rights reserved.