在定义另一个宏时,我可以捕获一个宏的基础值吗?

Bee*_*ope 5 c c-preprocessor

想象一下,我想要#define一个宏,使其等于另一个宏的当前值(如果存在这样的概念).

例如:

#include "def_a.h"  // defines macro A
#define B A
Run Code Online (Sandbox Code Playgroud)

这定义BA.如果A后来的变化定义(即,通过重新定义)的值B也发生变化(因为B扩展到A在使用点,这进一步扩展到的新值A).

我想一些方法来"烤在"值AB,这样B只是扩展到的价值A,而不是A自己.

例如:

#define A first
#define B BAKE_IN(A)
#undef A
#define A second
#define C BAKE_IN(A)
#undef A
#define A third

// here I want B to expand to first, and C to expand to second
Run Code Online (Sandbox Code Playgroud)

当然BAKE_IN不是真的,但我想知道是否有某种方法可以达到这个效果.

现在,我并没有真正说明如果A本身是用其他宏来定义会发生什么,但我可以用"一级扩展"(即B得到A的值扩展,所以进一步的宏)保持)并且还"完全扩展"(即A完全展开,递归,因为它将在使用点).

ric*_*ici 1

宏在指令体中永远不会被替换#define,因此无法将宏定义为另一个宏的当前值,除非宏的值为常量算术表达式的有限情况。

在后一种情况下,您可以使用Boost 预处理器BOOST_PP_ASSIGN_SLOT(虽然大多数 Boost 库都是特定于 C++ 的,但 Boost 预处理器库适用于 C 和 C++,并且不依赖于任何其他 Boost 组件。)