相关疑难解决方法(0)

如何使用C预处理器连接两次并扩展宏,如"arg ## _ ## MACRO"?

我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:

#define VARIABLE 3
#define NAME(fun) fun ## _ ## VARIABLE

int NAME(some_function)(int a);
Run Code Online (Sandbox Code Playgroud)

不幸的是,宏NAME()将其转化为

int some_function_VARIABLE(int a);
Run Code Online (Sandbox Code Playgroud)

而不是

int some_function_3(int a);
Run Code Online (Sandbox Code Playgroud)

所以这显然是错误的方式.幸运的是,VARIABLE的不同可能值的数量很小所以我可以简单地做一个#if VARIABLE == n并单独列出所有情况,但我想知道是否有一个聪明的方法来做到这一点.

c concatenation token c-preprocessor

141
推荐指数
3
解决办法
7万
查看次数

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

我的代码是

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

c macros c-preprocessor boost-preprocessor

5
推荐指数
1
解决办法
818
查看次数