有没有办法将宏名称作为参数传递给嵌套宏,而不扩展最外层的宏?

R16*_*60K 8 c c++ macros

(对于长标题道歉,但我想不出一个不那么明确的标题)

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

#define ROOT_FUNC(INPUT) int v_ ## INPUT = INPUT
#define CALLER_FUNC(INPUT) ROOT_FUNC(INPUT)

#define INTA 1
#define INTB 2
#define INTC 3
Run Code Online (Sandbox Code Playgroud)

现在,如果我ROOT_FUNC(INTA);在我的代码中写入,我会得到一个v_INTA用值调用的整数变量1.如果我在代码中定义一个变量int INTD = 4;,然后写,CALLER_FUNC(INTD);我最后得到一个v_INTD用值调用的整数变量4.

但是,如果我写,CALLER_FUNC(INTA);我得到一个名为v_1值的整数变量1,因为INTA扩展到1当时CALLER_FUNC是扩展的,之前ROOT_FUNC是扩展的(即ROOT_FUNC(1)扩展的内容).

如果我将第2行更改为:( #define CALLER_FUNC(INPUT) ROOT_FUNC(#INPUT)即字符串化INPUT),则会发生编译器错误,因为要求它定义一个名为v_"1"(无效名称)的整数变量并为其赋值"1"(非整数值).

我知道预处理器是相当原始的,但有没有办法实现我追求的目标?

(第二次编辑为了进一步说明,我想CALLER_FUNC(INTA);首先扩展ROOT_FUNC(INTA);,然后到int v_INTA = 1;- 即我想INTA扩展内部ROOT_FUNC而不是外部.我原则上寻找答案,而不是任何改变CALLER_FUNC产生结果的方法int v_INTA = 1;,这将是微不足道的).


PS如果您想知道,我最初有一个涉及信号处理的用例(例如,将宏名称SIGINT作为嵌套宏的输入),但通过简化我的结构并放弃嵌套宏来克服这些限制; 因此这个问题纯粹是学术性的.

Nim*_*Nim 6

如果您可以扩展第一个宏以接受两个参数,您可以让它像这样工作:

#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);
}
Run Code Online (Sandbox Code Playgroud)

输出(来自 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?
}
Run Code Online (Sandbox Code Playgroud)

我想这就是你所追求的——如果我读对了你的问题?

标记粘贴防止预处理器将其扩展并简单地生成一个新标记,该标记传递给第二个宏(然后简单地将其粘贴在一起以形成变量),值(已扩展)作为第二个参数传递..


EDIT1:阅读更多你所追求的东西,我猜上面的技巧不是你真正想要的......嗯......

  • 这实际上是一个非常好的 hack - 事实上,这在我原来的(现已放弃的)用例中是可行的。这当然仅适用于内部函数想要粘贴宏的情况的子集,但只有三种可能的情况:内部函数可以粘贴、扩展或字符串化宏,并且与后两种情况无关。宏被扩展/字符串化的链,结果总是相同的。因此,我认为我们现在有了一个完整的模型。唯一的缺点是多个调用函数可能必须包含相同的粘贴,从而降低了宏效率。 (2认同)