文档章节

#的在宏定义中的作用

seanking
 seanking
发布于 2016/02/17 13:47
字数 145
阅读 8
收藏 0
点赞 1
评论 0
#

在C/C++中#可以将宏的变量名称转换成字符串

例如MFC源码中

struct AFX_MAP_MESSAGE
{
	UINT    nMsg;
	LPCSTR  lpszMsg;
};

#define DEFINE_MESSAGE(wm)  { wm, #wm }

static const AFX_MAP_MESSAGE allMessages[] =
{
	DEFINE_MESSAGE(WM_CREATE),
	DEFINE_MESSAGE(WM_DESTROY),
	DEFINE_MESSAGE(WM_MOVE),
//此处省略
	DEFINE_MESSAGE(WM_DEVICECHANGE),
	{ 0, NULL, }    // end of message list
};

#undef DEFINE_MESSAGE

通过这种方法可以方便的形成枚举,常数,宏名的字符串输出列表。通过下面的代码可以将值转变成成字符串

UINT nMsg = WM_CREATE; 
LPCSTR lpszMsgName = NULL;
const AFX_MAP_MESSAGE* pMapMsg = allMessages;
for (/*null*/; pMapMsg->lpszMsg != NULL; pMapMsg++)
{
	if (pMapMsg->nMsg == nMsg)
	{
		lpszMsgName = pMapMsg->lpszMsg;
		break;
	}
}



© 著作权归作者所有

共有 人打赏支持
seanking
粉丝 3
博文 13
码字总数 5960
作品 0
杭州
高级程序员
C语言宏定义中#和##的作用

在宏定义中#和##的作用是:前者将宏定义的变量转化为字符串;后者将其前后的两个宏定义中的两个变量无缝拼接在一起转化为字符串。 1. #: 在宏定义中,将其后的变量,转化为字符串。 eg: #d...

水海云 ⋅ 2013/04/16 ⋅ 0

C语言基础-07-预处理指令1-宏定义

预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编...

Corwien ⋅ 2016/03/16 ⋅ 0

关于宏定义

1、宏定义要加括号的原因?例如定义一个宏: define div(x,y) xy 因为宏定义在预处理阶段是内容严格的替换,如果调用div(a+b,y),替换后就成了a+by;不是我们想要的结果(a+b)y,所以宏的定义,...

Ne0o0 ⋅ 2013/06/19 ⋅ 0

关于C/C++中宏定义的一些新认识

在项目开发的过程中会遇到很多的宏定义,宏定义的作用目前本人知道的有三种有法: 第一种: #define OK 1 这种用法可以直接了当的表明代码的用意,从而防止“魔数”的出现,恰当的宏定义一些...

王维来 ⋅ 2016/11/12 ⋅ 0

一起来学习 系统封装接口层- CMSIS-OS 之freeRTOS

原文链接:http://blog.csdn.net/cornrn/article/details/72473845 在这个实时操作系统泛滥的年代,有这么一个系统封装接口层还是蛮有必要的。前些时间偶然间在STM32最新的固件库中就发现了这...

u014572382 ⋅ 2017/11/15 ⋅ 0

十五、预处理指令1-宏定义

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略 预处理指令简介 1....

长平狐 ⋅ 2013/03/28 ⋅ 0

Hello, 宏定义魔法世界

宏,简单来说就是按预定义的规则来替换相应的文本内容,被替换的文本内容可以是对象也可以是函数。既然是替换,那就需要遵循一定的规则来执行,这里的规则就是本文要讨论的主要内容,希望通过...

金小俊 ⋅ 2017/11/10 ⋅ 0

深入理解C语言的define

上一篇讲到#include这个预编译指令,还有个常用的预编译指令:#define。它的表面意思是定义,通常被说成“定义常量”,但其真正作用是替换; 如: #define SUCCESS 1 这整句话是定义一个宏替...

ningcaichen66 ⋅ 2017/09/22 ⋅ 0

iOS代码运行的磨刀石-预编译指令

iOS中代码运行的磨刀石--预编译指令 所谓预编译,就是程序代码在编译之前,开发工具为我们预先做的一些工作。不要小瞧这些指令,没有它们,我们的代码可能寸步难行。 一、文件包含相关预处理...

珲少 ⋅ 2015/04/28 ⋅ 0

“#”的迷雾

在代码中使用Autolayout时,大家都会使用这个宏,这个宏可以生成一个变量名到变量值映射的Dictionary。比如将会生成一个的Dictionary。它是怎么做到的呢?我们来看看这个宏的定义: 这个宏定...

hejunbinlan ⋅ 2016/08/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 47分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部