C语言宏中#的功能是将其后面的宏参数进行字符串化操作(Stringizing operator),简单说就是在它引用的宏变量的左右各加上一个双引号。

如定义好#define STRING(x) #x之后,下面二条语句就等价。

char *pChar = "hello";
char *pChar = STRING(hello);

##它可以拼接符号(Token-pasting operator),如:

#define paster( n ) printf( "token"#n" = %d\n", token##n )
int token9 = 100;

再调用 paster(9);宏展开后token##n直接合并变成了token9。
整个语句变成了

printf( "token""9"" = %d", token9 );

在C语言中字符串中的二个相连的双引号会被自动忽略,于是上句等同于
printf("token9 = %d", token9);。
即输出token9 = 100

下面是我的具体测试代码,

#include <stdio.h>
#define test(a) printf("tt"#a"=%d\n",n1##a)#define DEBUG_LOG(fmt,level,args...) printf("DEBUG_"#level":"#fmt"\n",##args)int log_level = 0;
// #fmt 为将输入的参数 fmt改为 字符串输出
//  fmt 是传入什么参数打印什么参数
// ## 是为了拼接1个参数  实际我感觉在此处用处不大,如果有知道的可以提示下,谢谢。
#define debug_log_printf(fmt,level,args...) \
do\
{\if(level == log_level)\printf("DEBUG_"#level"[%s]"fmt"\n",__FUNCTION__,args) ;\
}while(0)
//__VA_ARGS__ 是一个可变参数的宏  ,意思是后面加几个参数都行
#define debug_log_printf1(fmt,level,...) \
do\
{\if(level == log_level)\printf("DEBUG_"#level"[%s]"fmt"\n",__FUNCTION__,##__VA_ARGS__) ;\
}while(0)void printf_test_fun(int n1ccb,int ccb)
{int num = 199;char str_test[] = "test_printf";test(ccb);DEBUG_LOG("n1ccb is %d",5,n1ccb);debug_log_printf("cc1b is %d",0,ccb);debug_log_printf1("n1ccb = %d num = %d %s",0,n1ccb,num,str_test);
}
int main(void){int n1ccb = 100;int ccb =88;printf("Hello World\n");printf_test_fun(n1ccb,ccb);return 0;}

如果有朋友有更好的见解或者我的代码中有问题,欢迎讨论和指出,谢谢。

【C语言】#和##的作用相关推荐

  1. C语言-return的作用总结

    目录 1.为调用的函数返回参数值 2.提前结束函数 3.返回一个函数 C语言return的作用是什么?相信很多新手小白对C语言return的作用的了解处于懵懂状态,通过这篇文章的总结,希望你能有所收获 ...

  2. C语言:static作用(修饰函数、局部变量、全局变量)

    C语言:static作用(修饰函数.局部变量.全局变量) 一. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.  全局变 ...

  3. %3c故乡%3e中语言描写的作用是什么,语言描写的作用

    语言描写的作用2019-05-05 14:39:30文/刘美娟 语言描写是塑造人物形象的重要手段,成功的语言描写总是鲜明地展示人物的性格,生动地表现人物的思想感情,深刻地反映人物的内心世界. 语言能显 ...

  4. step在c语言中什么作用,C语言step-by-step(二)(数据类型)

    第2章:数据类型 先介绍一些计算机指令简单的知识: 大家都知道我们的计算机有硬盘.有内存这两样东西,都属于存储器,但是硬盘属于在掉电后不丢失信息,一般我们把资料存放在硬盘:然而内存掉电会丢掉所有信息, ...

  5. %3c故乡%3e中语言描写的作用是什么,第三单元考试题

    为什么说"偷"?"偷"谁的豆? 讨论明确:孩子们认为背着大人摘豆吃是不应该的,所以直言不讳地说"偷".可是他们不是窃取别人的东西来肥私,有趣 ...

  6. c语言条件运算符的作用,条件运算符的用法_C运算符的结合方向

    JAVA语言 形式关系表达式 ? 表达式1 : 表达式2 求值规则 求解关系表达式,根据关系表达式的布尔值决定取值:关系表达式的值为true时取表达式1的值:关系表达式的值为false时取表达式2的值 ...

  7. 循环语句在c语言中的作用是什么,C语言中循环语句的使用

    C语言中的循环语句 在C语言中,有三种类型的循环语句: for语句.while语句和do While语句. 分别介绍如下: 1.for循环语句 for语句格式为: for(表达式1;表达式2;表达式3 ...

  8. main在c语言中的作用,main函数在C语言中是怎么定义的?有什么作用?

    main函数在C语言中是怎么定义的?有什么作用? 更新时间:2019-10-24 13:55 最满意答案 额,main不是程序的最开始啦.拿用glibc的程序来说,C语言执行的过程应该是 _start ...

  9. c语言s_gets函数作用,C语言中gets_s(),gets(),fgets()函数的比较。

    先来讲讲大家最熟悉的gets()函数. 1.gets()函数不安全. 2.C11标准委员会已经将其废除,建议能不用尽量不用. 解释: gets()函数的作用:它读取整行输入,直至遇到换行符,然后丢弃换 ...

  10. c语言算术运算的作用,C语言算术运算符和算术表达式

    C语言算术运算符和算术表达式 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.下面和大家分享一些C语言算术运算符和算术表达式,一起来看看吧! 一. 基本的算术运算符 (1)+(加法运算 ...

最新文章

  1. 在silverlight中通过对话框把选择的图片插入到RichTextBox中
  2. python websocket server_Python Websocket服务端
  3. search has not been saved
  4. 拆分:分解单块系统——《微服务设计》读书笔记
  5. [转] 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
  6. Winform中创建超链接,点击跳转网页
  7. 英特尔推出第二代神经拟态研究芯片Loihi 2和全新Lava软件框架
  8. 记录linux历史命令,如何将Linux系统的历史操作命令删除,并不再记录
  9. SSM中(Spring-SpringMVC-Mybatis)(二:整合)
  10. vuex - redux - mobx
  11. STM32 USB数据接收与数据发送程序流程分析
  12. 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径
  13. java声明接口_为什么必须用Java声明接口?
  14. mysql有rollup函数_如何在MySQL ROLLUP函数中替换NULL类别标题?
  15. java-阴历日期和阳历日期互相转换
  16. Pycharm this applicatation failed to start because it could not find or laod the qt plaform plugin
  17. 吸烟行为检测系统(Python+YOLOv5深度学习模型+清新界面)
  18. 1813 句子相似性 III
  19. 河南省第十届ACM赛题
  20. c语言程序设计试题汇编第三版勘误,c语言程序设计基础教程----勘误记录.pdf

热门文章

  1. gateway+vue实现防接口重放、防篡改
  2. 房地产暴利的秘密还鲜为人知(原创首发,深度好文)——何学林中国房地产大策划之五
  3. Ubuntu16.04笔记本 安装R RStudio
  4. 《14天动手学深度学习》——语言模型
  5. 【Nginx网站服务】
  6. 经济学里的那些字母都代表的意思
  7. 人工智能专业就业方向有哪些?
  8. 从HTTP状态 301,302,200 来看页面跳转
  9. Git安装、配置和使用
  10. php 阿里云短信服务及阿里大鱼实现短信验证码的发送