C语言--#、##、__VA_ARGS__ 和##__VA_ARGS__ 的使用

#  用来把参数转换成字符

  1. #include <stdio.h>
  2.  
  3. #define FUN(X) (printf("%s=%d\n",#X,X)) /* #用来把参数转换成字符 */
  4.  
  5. int test(int argc, char ** argv)
  6. {
  7. int a = 1;
  8. int b = 2;
  9.  
  10. FUN(a);
  11. FUN(b);
  12. FUN(a+b);
  13.  
  14. return 0;
  15. }
  16. /** 程序输出结果:
  17. *******************************
  18. a=1
  19. b=2
  20. a+b=3
  21. *******************************
  22. */
  23.  

2、## 把两个语言符号组合成单个语言符号

  1. #include <stdio.h>
  2.  
  3. #define XNAME(n) x##n /* ## 这个运算符把两个语言符号组合成单个语言符号*/
  4. #define PXN(n) printf("x"#n" = %d\n",x##n)
  5.  
  6. int main(int argc, char ** argv)
  7. {
  8. int XNAME(1) = 10886; /*宏展开就是:x1 = 10086*/
  9.  
  10. PXN(1); /*宏展开就是:printf("x1 = %d\n",x1) */
  11.  
  12. return 0;
  13. }
  14.  
  15. /** 程序输出结果:
  16. *******************************
  17. x1 = 10886
  18. *******************************
  19. */
  20.  
  21.  

3、__VA_ARGS__ 和 ##__VA_ARGS__

  1. #include "stdio.h"
  2.  
  3. #define DEBUG1(format, ...) do{ \
  4. printf(format, __VA_ARGS__); \
  5. \
  6. } while(0)
  7.  
  8. #define DEBUG2(format, args...) do{ \
  9. printf(format, ##args); \
  10. \
  11. } while(0)
  12.  
  13. #define DEBUG3(format, ...) do{ \
  14. printf(format, ##__VA_ARGS__); \
  15. \
  16. } while(0)
  17.  
  18. int
  19. main(int argc, char **argv)
  20. {
  21. printf("hello world.1 \n");
  22.  
  23. //DEBUG1("hello world.2\n");//错误 参数为零
  24. DEBUG1("hello world.2 %d %d\n", 1, 2);
  25.  
  26. DEBUG2("hello world.3\n");
  27. DEBUG2("hello world.3 %d %d %d\n", 1, 2, 3);
  28.  
  29. DEBUG3("hello world.4\n");
  30. DEBUG3("hello world.4 %d %d %d %d\n", 1, 2, 3, 4);
  31.  
  32. return 0;
  33. }

应用:

  1. #include "stdio.h"
  2.  
  3. #define DEBUG_ON
  4.  
  5. #ifdef DEBUG_ON
  6. #define DEBUG(format, ...) do{ \
  7. printf("File:%s, Line:%d, "format"", __FILE__, __LINE__, ##__VA_ARGS__); \
  8. \
  9. } while(0)
  10. #else
  11. #define DEBUG(format, ...)
  12. #endif
  13.  
  14.  
  15. int
  16. main(int argc, char **argv)
  17. {
  18.  
  19. DEBUG("hello world %d %d\n", 1, 2);
  20.  
  21. return 0;
  22. }
  23.  
  24. /**程序输出结果:
  25. ***********************************************************
  26. File:E:\C Language\printf.c, Line:19, hello world 1 2
  27. ***********************************************************
  28. */

 

1、#用来把参数转换成字符.

2、##这个运算符把两个语言符号组合成单个语言符号

3、 __VA_ARGS__ 是一个可变参数的宏,实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。

4、##__VA_ARGS__ 宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错。

5、注意宏定义连接符  \  后面不要有任何操作,直接回车,下一行的前面可以有空格。

 

======================================================-=============================================

为更好了解C/C++中可变参数的知识,我从网上摘录了两篇文章,算是自己的一个总结。本篇主要是关于“## __VA_ARGS__”宏的介绍和使用。

 

 

posted on 2020-08-23 16:39  莫水千流  阅读(3432)  评论(0编辑  收藏  举报