C语⾔中⽤宏动态命名变量名及函数名以及宏字符#和##的解
宏 # 和 ## 的解释
1.在⼀个预处理器宏中的参数前⾯使⽤⼀个#,预处理器会把这个参数转换为⼀个字符数组。
2 #是“字符串化”的意思。出现在宏定义中的#是把跟在后⾯的参数转换成⼀个字符串
3.关于记号粘贴操作符(token paste operator): ## 简单的说,“##”是⼀种分隔连接⽅式,它的作⽤是先分隔,然后进⾏强制连接。
4.其他相关 -- 单独的⼀个 # : ⾄于单独⼀个#,则表⽰对这个变量替换后,再加双引号引起来。
5.#(stringizing)字符串化操作符。其作⽤是:将宏定义中的传⼊参数名转换成⽤⼀对双引号括起来参数名字符串。其只能⽤于有传⼊参数的宏定义中,且必须置于宏定义体中的参数名前。
⽤宏动态命名变量名及函数名的例⼦:
#include <stdio.h>
#include <stdarg.h>
/**************** .H **********************/
//#define DVM_MODULE FLWMGR
/* Create variable name */
#define CONNECTION(uiPrt, DVM_MODULE) uiPrt##DVM_MODULE
#define NAME_CAT(uiPrt, DVM_MODULE) CONNECTION(uiPrt, DVM_MODULE)
int NAME_CAT(uiPrt, DVM_MODULE) = (1<<2);
/* create function name*/
text函数什么意思#define DVM_PRINT_REGISTER(TRACE_STRING, NUM) \
inline void _##TRACE_STRING (const char* p, ...); \
void _##TRACE_STRING (const char* p, ...) \
{ \
va_list args; \
if ((NAME_CAT(uiPrt, DVM_MODULE)) & (1 << NUM)) \
{ \
va_start(args, p); \
vprintf( p, args ); \
va_end(args);\
} \
}
/**************** .C ***************/
DVM_PRINT_REGISTER(FLWMGR_TRACE, 2)
void main()
{
_FLWMGR_TRACE("oooooooo %d %s\n", 5 , "fdsafd");
}
下⾯是另⼀个例⼦:
#define CONNECTION(text1,text2) text1##text2
#define CONNECT(text1,text2) CONNECTION(text1,text2)
int CONNECT(test,1212) = 1212; // int test1212 = 1212;
#define VAR 326
int CONNECT(test,VAR) = 326; // int test326 = 326;
#undef VAR
#define VAR 86
int CONNECT(test,VAR) = 86; // int test86 = 86;
#undef VAR
int CONNECT(test,__LINE__) = __LINE__; // int testXXX = XXX;
为了⽅便的⾃动命名,出现第3个宏
#define CONNECT_BY_LINE(text) CONNECT(text,__LINE__)
int CONNECT_BY_LINE(test) = __LINE__; // int testYYY = YYY;
简化版本如下:
#include <stdio.h>
#define SET_NAME(name) SET_NAME_2(name)
//#define SET_NAME_1(name) SET_NAME_2(name)
#define SET_NAME_2(name) test##name
int main()
{
int SET_NAME(1212) = 1212;
#define VAR 326
int SET_NAME(VAR) = 326;
#undef VAR
#define VAR 86
int SET_NAME(VAR) = 86;
#undef VAR
printf("%d %d %d\n",test1212,test326,test86);
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。