C语言宏定义中#号的作用

  • 前言
  • #号的作用

前言

最近,在阅读uboot的源码过程中,发现了一段宏定义代码:

#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd,       \_usage, _help, _comp)          \{ #_name, _maxargs, _rep, _cmd, _usage,            \_CMD_HELP(_help) _CMD_COMPLETE(_comp) }

在__name之前,带了一个#号,以前只知道宏定义中的##是用于连接两部分的内容,那么#号的作用是什么呢?

#号的作用

在C语言的宏定义中,#的功能是将其后面的参数进行字符串化操作,也就是说,对它所引用的宏变量通过替换后在其左右各加上一个双引号。
下面,我们用一段简单的代码,进行测试。

#include <stdio.h>typedef struct {char *name;
}CMD;#define DECLARE_CMD(__name) {#__name}; CMD test = DECLARE_CMD(test_string);
// CMD test = DECLARE_CMD(”test_string”);
void main(void)
{printf("%s", test.name);return 0;
}

编译运行,可以看到代码会输出:

test_string

因为宏定义的作用是直接进行替换,倘若此处不加“#”号,则需要在传入的宏参数加上双引号“”,以保证传入的数据是字符串类型的数据,否则的话,编译时便会提示错误。

C语言宏定义中#号的作用相关推荐

  1. 巧用c语言宏定义实现自动注释调试代码,C语言宏定义中的特殊用法

    C宏定义中的特殊用法 在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏.调试宏:宏的条件编译用法及特殊的宏关键字用法. #undef 限定宏的作用域 一般来讲宏 ...

  2. c程序语言符号的作用,c语言宏定义中的#,##,#@及\符号的作用

    1.#(stringizing)字符串化操作符 作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串.其只能用于有传入参数的宏定   义中,且必须置于宏定义体中的参数名前. 如: #def ...

  3. 宏定义中#号和##号的使用

    在技术群中有人提了一个问题:如何定义一个宏,打印传递过来的参数的地址.这很简单,像下面这样 [objc] view plaincopy #define pl(param)  NSLog(@" ...

  4. C语言宏定义中使用 do{}while(0) 的情形

    先来看宏定义的一个经典例子:使用MFC:新建单文档工程,把宏定义在视类CPP文件头部: void CHongdoView::OnDraw(CDC* pDC) {CHongdoDoc* pDoc = G ...

  5. c语言井号字符什么意思,关于c语言宏定义中的单#(井号)和双#(井号)

    看了这篇文章后了解了,但是文章中的例子比较特别,我在这里加个注释好了. 单井号就是将后面的 宏参数 进行字符串操作,就是将后面的参数用双引号引起来 双井号就是用于连接. 比如文章中的例子: #defi ...

  6. C语言宏定义中#define中的井号#的使用

    #include <stdlib.h> #include <stdio.h> #include <string.h>typedef enum {E_1,E_2,E_ ...

  7. C语言宏定义中UL的含义

    1.U表示 unsigned 无符号,L表示 long 长整数.后缀大小写都可以,可以单独使用(100U),也可以组合使用(100UL). 2.F表示float,但是F不可以和U组合,因为浮点数没有u ...

  8. C语言宏定义中的字符串替换

    ## 是连接符号,连接两个字符串 #是把名字代替成参数中的字符串 #define PRINTF(value)  printf( #value " = %d/n", value ); ...

  9. C语言 带参数宏定义中 # 和 ## 知识点总结、代码分析

    目录 一.宏定义中 "#"知识点 1.直接转换字符串,不展开. 2.转换出的结果一定是"字符串". 二.宏定义中 ## 知识点 1.应用场景 2."# ...

最新文章

  1. JMeter处理jdbc请求后的响应结果
  2. html怎么自动设为底部,让底部永远在页面最底部显示的css方法
  3. java包引入顺序_多个相同jar存在时的引用顺序
  4. h3c交换机 查看二层交换机端口ip_【分享】项目中如何选到称心如意的交换机?...
  5. 再见,付费录屏软件!我用70行Python代码打造免费版!
  6. 越成功的人越能直面人性的欲望
  7. NAACL2021论文:UniDrop:一种简单而有效的Transformer提升技术
  8. 【视频云端SDK】关于安卓指令集的兼容,Library xxx.so not found
  9. Freeswitch在内网,由服务器防火墙映射出来,IMSDROID作为被叫的问题
  10. Maven-maven插件(1)添加主类信息到MANIFEST.MF
  11. swiper教程--swiper的基础使用(二十)
  12. 计算机网络自动分配ip地址,计算机ip地址设置 自动获取IP和静态IP
  13. 如何使用Javascript复制到剪贴板
  14. Python构建投资模型(1)——从天天基金网爬数
  15. Leetcode1160. 拼写单词(C语言)
  16. mysql mgr recovering_mysql group replication recovering 怎么调整为 online
  17. 王峰五小时对话冯波:如果今天没有区块链,你会做什么?
  18. iPhone用android充电头,iPhone 6s用什么充电头充电最快?安卓快充头可以混用吗?
  19. 千锋网络安全笔记部分
  20. 空气动力学基本知识(二)

热门文章

  1. Oracle 通过15位或18位身份证号码计算年龄、出生年月日、性别
  2. 中国游客出境游搜索热度暴涨近六倍,毕业季和游学季到来欧洲国家的搜索热度持续上升 | 美通社头条...
  3. ARFoundation系列讲解 - 79 AR室内导航四
  4. java 新浪短链接_新浪(t.cn)短网址链接生成api接口
  5. 支付渠道对接验签失败
  6. EasyExcel使用Validator进行读取校验,批量处理数据,返回处理异常的行以及列
  7. 国内服务器不备案可以挂网站吗,国内服务器上放置的所有网站都必须备案
  8. 开放式耳机哪个品牌音质好?四款音质好的开放式耳机推荐
  9. JAVA将数字钱数转换为大写
  10. 使用VUEJS2.0制作音乐播放器