如何在粘贴之前强制处理器使用表达式结果

Bob*_*Bob 5 c macros c-preprocessor boost-preprocessor

我的代码是

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

我希望结果是

int main()
{
    11;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

可编译链接:http://coliru.stacked-crooked.com/a/b35ea3e35a1b56ae

我在粘贴之前放入了如何保证参数的完整宏扩展?建议的两个间接级别。

但我仍然收到预处理器错误:

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

在进行串联之前,如何让预处理器解析该表达式的结果?

Cha*_*ria 4

看起来您正在尝试让预处理器评估一些简单的数学运算并转换为结果。如果没有大量额外的宏观基础设施来执行必要的数学计算,这是不可能的。获得所需基础设施的最简单方法可能是使用 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));
Run Code Online (Sandbox Code Playgroud)

现在答案是 11,我想这就是您正在寻找的。

  • “Boost 预处理库是一个宏库,支持预处理器元编程。**该库支持 C++ 和 C 编译。它不依赖于任何其他 Boost 库,因此可以用作独立库**” - http://www.boost.org/doc/libs/1_59_0/libs/preprocessor/doc/index.html (4认同)