我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:
#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宏,它创建一个名称基于行号的函数.我以为我可以做类似的事情(真正的函数会在括号内有声明):
#define UNIQUE static void Unique_##__LINE__(void) {}
Run Code Online (Sandbox Code Playgroud)
我希望将扩展到以下内容:
static void Unique_23(void) {}
Run Code Online (Sandbox Code Playgroud)
这不起作用.使用令牌连接,定位宏按字面处理,最终扩展为:
static void Unique___LINE__(void) {}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
(是的,无论这看起来多么无用,我都有一个真正的理由要这样做).
我正在尝试定义一个宏,假设它采用2个字符串值并返回它们之间的一个空格连接.似乎我可以使用除空间之外我想要的任何角色,例如:
#define conc(str1,str2) #str1 ## #str2
#define space_conc(str1,str2) conc(str1,-) ## #str2
space_conc(idan,oop);
Run Code Online (Sandbox Code Playgroud)
space_conc 将返回"idan-oop"
我想要一些东西回归"idan oop",建议?