关于预处理过程中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)
如果 z
和 p
是固定类型的值,您可能会遇到一些糟糕的事情,例如:
#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 调用结合起来呢?
我有一个包含两个实体的现有 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)
如果 z
和 p
是固定类型的值,您可能会遇到一些糟糕的事情,例如:
#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 调用结合起来呢?