c++ - C++ 是一种将宏名作为参数传递给嵌套宏的方法,如果最外面的宏展开,则?

  显示原文与译文双语对照的内容
105 3

( 对这个长标题很抱歉,但是我不能想到一个足够明确的标题。)

我需要将( 对象) 宏的名称传递给嵌套的( 函数) 宏,如下面的( trivial ) 示例所示:

#define ROOT_FUNC(INPUT) int v_ ## INPUT = INPUT
#define CALLER_FUNC(INPUT) ROOT_FUNC(INPUT)
#define INTA 1
#define INTB 2
#define INTC 3

现在,如果在代码中写 ROOT_FUNC(INTA);,我得到一个名为 v_INTA的整型变量,。如果我在代码中定义一个变量int INTD = 4;,然后写入 CALLER_FUNC(INTD);,然后使用一个名为 v_INTD的整数变量,它的值为 4

但是如果我写 CALLER_FUNC(INTA);,得到一个整型变量,它的值为 1,因为 INTA 在扩展时扩展到 1,在扩展之前扩展( 例如 ) 。ROOT_FUNC(1) 是什么。

如果将第 2行改为:#define CALLER_FUNC(INPUT) ROOT_FUNC(#INPUT)由于要求定义一个名为 v_"1" ( 无效名称)的整数变量,并为它的提供值 "1" ( 非整数值),会出现编译器错误( 例如 。stringifying INPUT ) 。

我知道预处理器是相当原始的,但是有什么方法可以实现我所追求的?

( 为了进一步澄清,我希望 CALLER_FUNC(INTA); 先扩展到 ROOT_FUNC(INTA);,然后再int v_INTA = 1;/换句话说,希望 INTAROOT_FUNC 内部扩展,而不是在外部扩展。我在寻找一个原则上的答案,而不是任何改变 CALLER_FUNC 产生结果的方法int v_INTA = 1;这将是微不足道的。

P.S 。如果你想知道,我最初有一个涉及信号处理( 比如 )的用例。将宏名称作为嵌套宏的输入,但是通过简化我的结构来解决这些限制。

时间:原作者:0个回答

108 0

如果可以展开第一个宏以接受两个参数,则可以将它的设置为如下所示:

#define FUNC(intname, intv) int v##intname = intv
#define CALL_FUNC(intv) FUNC(_##intv, intv)
#define INT1 1
#define INT2 2
int main(void)
{
 int INTD = 4;
 CALL_FUNC(INT1);
 CALL_FUNC(INT2);
 CALL_FUNC(INTD);
}

输出( 来自 GCC ),看起来像这样:

int main(void)
{
 int INTD = 4;
 int v_INT1 = 1;
 int v_INT2 = 2;
 int v_INTD = INTD;//not sure if you want the value of INTD here - I guess it doesn't matter?
}

我想你就是这么想的如果我read你的问题?

令牌粘贴阻止预处理器扩展它并仅生成传递给第二个宏( 然后把它们粘在一起形成一个变量)的新令牌,值( 它被扩展) 作为第二个参数。

我觉得你应该知道上面的技巧不是你想要的。

原作者:
...