用宏动态命名变量名及函数名以及宏字符 # 和 ## 的解释

7590阅读 0评论2016-03-22 xhx321
分类:C/C++

宏 # 和 ## 的解释
1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组。
2 #是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串
3.关于记号粘贴操作符(token paste operator): ## 简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。
4.其他相关 -- 单独的一个 # : 至于单独一个#,则表示对这个变量替换后,再加双引号引起来。
5.#(stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 

用宏动态命名变量名及函数名的例子:
点击(此处)折叠或打开
  1. #include <stdio.h>
  2. #include <stdarg.h>

  3. /**************** .**********************/
  4. //#define DVM_MODULE FLWMGR

  5. /* Create variable name */
  6. #define CONNECTION(uiPrt, DVM_MODULE) uiPrt##DVM_MODULE
  7. #define NAME_CAT(uiPrt, DVM_MODULE) CONNECTION(uiPrt, DVM_MODULE)

  8. int NAME_CAT(uiPrt, DVM_MODULE) = (1<<2);

  9. /* create function name*/
  10. #define DVM_PRINT_REGISTER(TRACE_STRING, NUM) \
  11.     inline void _##TRACE_STRING (const char* p, ...); \
  12.     void _##TRACE_STRING (const char* p, ...) \
  13.     { \
  14.         va_list args; \
  15.         if ((NAME_CAT(uiPrt, DVM_MODULE)) & (<< NUM)) \
  16.         { \
  17.             va_start(args, p); \
  18.             vprintf( p, args ); \
  19.             va_end(args);\
  20.         } \
  21.     }



  22. /**************** .***************/

  23. DVM_PRINT_REGISTER(FLWMGR_TRACE, 2)

  24. void main()
  25. {
  26.     _FLWMGR_TRACE("oooooooo %d %s\n", 5 , "fdsafd");
  27. }

=========================================================================
以下转自:http://blog.sina.com.cn/s/blog_6a8766400100uh3v.html

点击(此处)折叠或打开

  1. #define CONNECTION(text1,text2) text1##text2
  2. #define CONNECT(text1,text2) CONNECTION(text1,text2)

  3.     int CONNECT(test,1212) = 1212; // int test1212 = 1212;

  4. #define VAR 326
  5.     int CONNECT(test,VAR) = 326; // int test326 = 326;
  6. #undef VAR

  7. #define VAR 86
  8.     int CONNECT(test,VAR) = 86; // int test86 = 86;
  9. #undef VAR

  10.    int CONNECT(test,__LINE__) = __LINE__; // int testXXX = XXX;


  11. 为了方便的自动命名,出现第3个宏
  12. #define CONNECT_BY_LINE(text) CONNECT(text,__LINE__)

  13.    int CONNECT_BY_LINE(test) = __LINE__; // int testYYY = YYY;


  14. 简化版本如下:
  15. #include <stdio.h>

  16. #define SET_NAME(name) SET_NAME_2(name)
  17. //#define SET_NAME_1(name) SET_NAME_2(name)
  18. #define SET_NAME_2(name) test##name

  19. int main()
  20. {
  21.     int SET_NAME(1212) = 1212;
  22. #define VAR 326
  23.     int SET_NAME(VAR) = 326;
  24. #undef VAR
  25. #define VAR 86
  26.     int SET_NAME(VAR) = 86;
  27. #undef VAR
  28.     printf("%d %d %d\n",test1212,test326,test86);
  29.     return 0;
  30. }
上一篇:常用码流分析工具
下一篇:没有了