【发布时间】:2015-02-13 06:02:35
【问题描述】:
(抱歉,标题太长了,但我想不出一个更具体但足够清楚的标题)
我需要将(类对象)宏的名称传递给嵌套(类函数)宏,如以下(简单)示例:
#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 的整数变量,其值为1。如果我在代码中定义一个变量int INTD = 4;,然后编写CALLER_FUNC(INTD);,我最终会得到一个名为v_INTD 的整数变量,其值为4。
但是如果我写CALLER_FUNC(INTA);,我会得到一个名为v_1 的整数变量,其值为1,因为INTA 在CALLER_FUNC 扩展时扩展为1,在ROOT_FUNC 之前被扩展(即ROOT_FUNC(1) 被扩展)。
如果我将第 2 行更改为:#define CALLER_FUNC(INPUT) ROOT_FUNC(#INPUT)(即对INPUT 进行字符串化),则会发生编译器错误,因为它被要求定义一个名为v_"1"(无效名称)的整数变量并为其赋值@ 987654340@(非整数值)。
我知道预处理器相当原始,但是有什么方法可以实现我所追求的吗?
(第二次编辑以进一步澄清,我希望 CALLER_FUNC(INTA); 首先扩展为 ROOT_FUNC(INTA);,然后扩展为 int v_INTA = 1; - 即我希望 INTA 在 ROOT_FUNC 内部扩展,而不是在其外部。我是原则上寻找答案,而不仅仅是改变CALLER_FUNC以产生结果int v_INTA = 1;的任何方式,这将是微不足道的)。
附:
如果您想知道,我最初有一个涉及信号处理的用例(例如,将 SIGINT 之类的宏名称作为嵌套宏的输入),但通过简化我的结构并放弃嵌套宏来解决这些限制;因此这个问题纯属学术性的。
【问题讨论】:
-
我仍然不清楚你想要什么。请举例说明预期输出是什么。
-
MASTER是什么?你的意思是ROOT_FUNC? -
@remyabel 所需的输出将是:
CALLER_FUNC(INTA);扩展为ROOT_FUNC(INTA);,然后扩展为int v_INTA = 1;(具体示例只是一个随机且微不足道的示例)。目前它扩展到ROOT_FUNC(1);,然后扩展到int v_1 = 1;(即INTA在传递给ROOT_FUNC()之前被扩展,而我希望它在之后发生)。 -
@T.C.我确实——已经改变了。
-
我认为这是不可能的。如果我正确阅读规范,参数在被替换到替换列表之前会被宏扩展,除非它们是
#或##的操作数,但在这些情况下你没有办法拿回论据。