如何强制处理器在粘贴前使用表达式结果
How to force processor to use result of expression before pasting
我的密码是
#define PASTE__(a, b) a##b
#define PASTE_(a, b) PASTE__(a, b)
#define PASTE(a, b) PASTE_(a, b)
int main()
{
PASTE(1, (1+3)/4);
return 0;
}
我希望结果是
int main()
{
11;
return 0;
}
可编译link:http://coliru.stacked-crooked.com/a/b35ea3e35a1b56ae
我放入了 How can I guarantee full macro expansion of a parameter before paste? 建议的两层间接寻址。
但我仍然收到预处理器错误:
main.c:8:11: error: pasting "1" and "(" does not give a valid preprocessing token
PASTE(1, (1+3)/4);
^
main.c:1:23: note: in definition of macro 'PASTE__'
#define PASTE__(a, b) a##b
^
main.c:3:21: note: in expansion of macro 'PASTE_'
#define PASTE(a, b) PASTE_(a, b)
^
main.c:8:5: note: in expansion of macro 'PASTE'
PASTE(1, (1+3)/4);
如何让预处理器在进行串联之前解析该表达式的结果?
您希望PASTE
行的预处理器输出确切 是什么? 11;
?这不可能。 (更新:显然 可以使用足够聪明的宏。请参阅 Charles Ofria 的回答)。
具有多个宏的双重扩展仅对扩展宏然后将结果字符串化有用,IIRC。
您似乎在尝试让预处理器计算一些简单的数学运算并转换为结果。如果没有大量额外的宏基础设施来执行必要的数学运算,这是不可能的。获得所需基础设施的最简单方法可能是使用 BOOST_PP.
http://www.boost.org/doc/libs/1_59_0/libs/preprocessor/doc/index.html
您需要修改代码,以便使用宏而不是运算符来执行数学运算。有问题的行看起来像:
PASTE(1, BOOST_PP_DIV(BOOST_PP_ADD(1,3),4));
现在答案应该是 11,我想这就是您要找的。
我的密码是
#define PASTE__(a, b) a##b
#define PASTE_(a, b) PASTE__(a, b)
#define PASTE(a, b) PASTE_(a, b)
int main()
{
PASTE(1, (1+3)/4);
return 0;
}
我希望结果是
int main()
{
11;
return 0;
}
可编译link:http://coliru.stacked-crooked.com/a/b35ea3e35a1b56ae
我放入了 How can I guarantee full macro expansion of a parameter before paste? 建议的两层间接寻址。
但我仍然收到预处理器错误:
main.c:8:11: error: pasting "1" and "(" does not give a valid preprocessing token
PASTE(1, (1+3)/4);
^
main.c:1:23: note: in definition of macro 'PASTE__'
#define PASTE__(a, b) a##b
^
main.c:3:21: note: in expansion of macro 'PASTE_'
#define PASTE(a, b) PASTE_(a, b)
^
main.c:8:5: note: in expansion of macro 'PASTE'
PASTE(1, (1+3)/4);
如何让预处理器在进行串联之前解析该表达式的结果?
您希望PASTE
行的预处理器输出确切 是什么? 11;
?这不可能。 (更新:显然 可以使用足够聪明的宏。请参阅 Charles Ofria 的回答)。
具有多个宏的双重扩展仅对扩展宏然后将结果字符串化有用,IIRC。
您似乎在尝试让预处理器计算一些简单的数学运算并转换为结果。如果没有大量额外的宏基础设施来执行必要的数学运算,这是不可能的。获得所需基础设施的最简单方法可能是使用 BOOST_PP.
http://www.boost.org/doc/libs/1_59_0/libs/preprocessor/doc/index.html
您需要修改代码,以便使用宏而不是运算符来执行数学运算。有问题的行看起来像:
PASTE(1, BOOST_PP_DIV(BOOST_PP_ADD(1,3),4));
现在答案应该是 11,我想这就是您要找的。