C语言宏定义中#号的作用
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语言宏定义中#号的作用相关推荐
- 巧用c语言宏定义实现自动注释调试代码,C语言宏定义中的特殊用法
C宏定义中的特殊用法 在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏.调试宏:宏的条件编译用法及特殊的宏关键字用法. #undef 限定宏的作用域 一般来讲宏 ...
- c程序语言符号的作用,c语言宏定义中的#,##,#@及\符号的作用
1.#(stringizing)字符串化操作符 作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串.其只能用于有传入参数的宏定 义中,且必须置于宏定义体中的参数名前. 如: #def ...
- 宏定义中#号和##号的使用
在技术群中有人提了一个问题:如何定义一个宏,打印传递过来的参数的地址.这很简单,像下面这样 [objc] view plaincopy #define pl(param) NSLog(@" ...
- C语言宏定义中使用 do{}while(0) 的情形
先来看宏定义的一个经典例子:使用MFC:新建单文档工程,把宏定义在视类CPP文件头部: void CHongdoView::OnDraw(CDC* pDC) {CHongdoDoc* pDoc = G ...
- c语言井号字符什么意思,关于c语言宏定义中的单#(井号)和双#(井号)
看了这篇文章后了解了,但是文章中的例子比较特别,我在这里加个注释好了. 单井号就是将后面的 宏参数 进行字符串操作,就是将后面的参数用双引号引起来 双井号就是用于连接. 比如文章中的例子: #defi ...
- C语言宏定义中#define中的井号#的使用
#include <stdlib.h> #include <stdio.h> #include <string.h>typedef enum {E_1,E_2,E_ ...
- C语言宏定义中UL的含义
1.U表示 unsigned 无符号,L表示 long 长整数.后缀大小写都可以,可以单独使用(100U),也可以组合使用(100UL). 2.F表示float,但是F不可以和U组合,因为浮点数没有u ...
- C语言宏定义中的字符串替换
## 是连接符号,连接两个字符串 #是把名字代替成参数中的字符串 #define PRINTF(value) printf( #value " = %d/n", value ); ...
- C语言 带参数宏定义中 # 和 ## 知识点总结、代码分析
目录 一.宏定义中 "#"知识点 1.直接转换字符串,不展开. 2.转换出的结果一定是"字符串". 二.宏定义中 ## 知识点 1.应用场景 2."# ...
最新文章
- JMeter处理jdbc请求后的响应结果
- html怎么自动设为底部,让底部永远在页面最底部显示的css方法
- java包引入顺序_多个相同jar存在时的引用顺序
- h3c交换机 查看二层交换机端口ip_【分享】项目中如何选到称心如意的交换机?...
- 再见,付费录屏软件!我用70行Python代码打造免费版!
- 越成功的人越能直面人性的欲望
- NAACL2021论文:UniDrop:一种简单而有效的Transformer提升技术
- 【视频云端SDK】关于安卓指令集的兼容,Library xxx.so not found
- Freeswitch在内网,由服务器防火墙映射出来,IMSDROID作为被叫的问题
- Maven-maven插件(1)添加主类信息到MANIFEST.MF
- swiper教程--swiper的基础使用(二十)
- 计算机网络自动分配ip地址,计算机ip地址设置 自动获取IP和静态IP
- 如何使用Javascript复制到剪贴板
- Python构建投资模型(1)——从天天基金网爬数
- Leetcode1160. 拼写单词(C语言)
- mysql mgr recovering_mysql group replication recovering 怎么调整为 online
- 王峰五小时对话冯波:如果今天没有区块链,你会做什么?
- iPhone用android充电头,iPhone 6s用什么充电头充电最快?安卓快充头可以混用吗?
- 千锋网络安全笔记部分
- 空气动力学基本知识(二)
热门文章
- Oracle 通过15位或18位身份证号码计算年龄、出生年月日、性别
- 中国游客出境游搜索热度暴涨近六倍,毕业季和游学季到来欧洲国家的搜索热度持续上升 | 美通社头条...
- ARFoundation系列讲解 - 79 AR室内导航四
- java 新浪短链接_新浪(t.cn)短网址链接生成api接口
- 支付渠道对接验签失败
- EasyExcel使用Validator进行读取校验,批量处理数据,返回处理异常的行以及列
- 国内服务器不备案可以挂网站吗,国内服务器上放置的所有网站都必须备案
- 开放式耳机哪个品牌音质好?四款音质好的开放式耳机推荐
- JAVA将数字钱数转换为大写
- 使用VUEJS2.0制作音乐播放器