关于预处理过程中MACROS的扩展

Regarding expansion of MACROS during preprocessing

我有一个包含两个实体的现有 MACRO。 ROOT_MACRO(x,y)

我想像这样定义 2 个新宏:- MACRO_1(x,y)= ROOT_MACRO(z,x__y)

这里我希望 z 在使用 MACRO_2 的预处理中被评估 对于前。我的 cpp 文件看起来像这样:-

MACRO_2(z)

MACRO_1(x,y)==> 应该扩展到 ROOT_MACRO(z,x__y)

//稍后在.cpp文件中,

MACRO_2(p)

MACRO_1(x,y)==> 这里应该展开为 ROOT_MACRO(p,x__y)

有办法实现吗?我希望问题很清楚。

如果我没理解错的话,你想要类似下面的东西:

#define MACRO_2(p) #define MACRO_2_DEFINED p
#define MACRO_1(x,y) ROOT_MACRO(MACRO_2_DEFINED,x__y)

但是 cpp(c 预处理器)是一次性工作的,你不能 define a define。如果您能够更改构建系统,您可以做的是在将代码发送到 cpp 之前使用 m4。这是一个使用 m4 的例子:

#define ROOT_MACRO(x,y) This is the root macro with arguments x and y
define(`MACRO_2',`#undef MACRO_2_DEFINED
#define MACRO_2_DEFINED ')
define(`MACRO_1', `ROOT_MACRO(MACRO_2_DEFINED, __)')

MACRO_2(z)
MACRO_1(x,y)

MACRO_2(p)
MACRO_1(x,y)

然后 运行 m4 上面的文件(例如 $m4 foo.c)产生:

#define ROOT_MACRO(x,y) This is the root macro with arguments x and y



#undef MACRO_2_DEFINED
#define MACRO_2_DEFINED z
ROOT_MACRO(MACRO_2_DEFINED, x__y)

#undef MACRO_2_DEFINED
#define MACRO_2_DEFINED p
ROOT_MACRO(MACRO_2_DEFINED, x__y)

和 运行 cpp 上面的代码(例如 $m4 foo.c | cpp -)产生:

# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"






This is the root macro with arguments z and x__y



This is the root macro with arguments p and x__y

@davir 是对的,你不能#define 定义。使用标准预处理器可以获得的最好结果是这样的:

#define  M1(x,y) MACRO_BASE(M2, x##__##y)

...
#define M2 z
M1(x,y) //# expands to MACRO_BASE(z,x__y)

...//later
#define M2 p
M1(x,y) //# expands to MACRO_BASE(p,x__y)

如果 zp 是固定类型的值,您可能会遇到一些糟糕的事情,例如:

#define M2(v) thetype_t current_m2__ = v
#define M1(x,y) MACRO_BASE(current_m2__, x##__##y)

只要您始终在与 M1 相同的范围内对 M2 进行一次且仅一次调用,该方法就可以工作。

但为什么不像 #define M(v,x,y) MACRO_BASE(v,x##__##y) 那样将 M2 和 M1 调用结合起来呢?