相关疑难解决方法(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万
查看次数

在宏中生成包含文件名

我正在尝试在宏中生成包含文件名.这在C++中应该是合法的:

#define INCLUDE_FILE "module_impl_win.hpp"
#include INCLUDE_FILE
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但是一旦我尝试生成文件名就很难编译

#define INCLUDE_FILE(M) M##"_impl_win.hpp"
#include INCLUDE_FILE("module")
Run Code Online (Sandbox Code Playgroud)

实际上它给了我MSVC2010的警告

警告C4067:预处理器指令后面的意外令牌 - 期望一个newlin

但它不包括该文件.

问题是什么?我怎么能摆脱它?

c++ macros include

20
推荐指数
1
解决办法
6883
查看次数

标签 统计

c ×1

c++ ×1

c-preprocessor ×1

concatenation ×1

include ×1

macros ×1

token ×1