在某些特殊场合下,我们可能需要定义一个字符串宏,但又不能用双引号
比如像这样

#define HELLO hello world

如果我们只是简单的展开HELLO,肯定会无法编译

std::cout << HELLO << std::endl;

展开后变为

std::cout << hello world << std::endl;

是的,作为字符串,缺少了基本的双引号,而我们这里又要求不可以在宏中加上双引号
好在宏可以嵌套,增加一个宏

#define HELLO hello world
#define _TMP(str) #str

"#"的作用是把紧跟着的变量替换为字符串

_TMP(HELLO)

预想的情况下,展开后应该是

"hello world"

而实际情况呢,展开后变成了

"HELLO"

为什么会这样?注意,这里的HELLO是大写,也就是说_TMP宏并没有将参数str当做宏去展开
所以这里要记得一点:
宏中有#运算符时,参数不会被展开

为了能让参数被顺利展开所以就不可以使用"#"符号,最终的宏定义如下

#define HELLO hello world
#define _A(str) _TMP(str)
#define _TMP(str) #str std::cout << _A(HELLO) << std::endl;

1.展开_A,由于没有"#"符号,HELLO被顺利展开,变为 _TMP(hello world)
2._TMP把参数hello world转换为字符串,也就是加上双引号,变为 "hello world"

至此,我们的目的就达成了!

C++ - 定义无双引号的字符串宏的更多相关文章

  1. qmake奇淫技巧之字符串宏定义

    阅读本文大概需要3.3分钟 我们平时在软件开发过程中需要定义一些宏,以便在代码中调用,这样每次不需要修改代码,只需要修改外部编译命令就可以得到想要的参数,非常方便 比如我们想在软件介绍中显示软件版本, ...

  2. 宏定义(无参宏定义和带参宏定义),C语言宏定义详解

    1.宏定义说明 宏定义是比较常用的预处理指令,即使用"标识符"来表示"替换列表"中的内容.标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏 ...

  3. ANSI 标准C 还定义了如下几个宏

    ANSI 标准C 还定义了如下几个宏:_LINE_ 表示正在编译的文件的行号_FILE_ 表示正在编译的文件的名字预处理名称意义#define 宏定义#undef 撤销已定义过的宏名#include ...

  4. springmvc返回不带引号的字符串

    springmvc返回不带引号的字符串项目使用springboot开发的,大部分出参为json,使用的fastJson,现在有的接口需要返回一个success字符串,发现返回结果为“success”, ...

  5. 将C语言宏定义数值转换成字符串!

    将C语言宏定义转换成字符串! 摘自:https://blog.csdn.net/happen23/article/details/50602667 2016年01月28日 19:15:47 六个九十度 ...

  6. Excel—在Excel中利用宏定义实现MD5对字符串(如:手机号)或者文件加密

    下载宏文件[md5宏] 加载宏 试验md5加密 可能遇到的问题 解决办法 下载宏文件[md5宏] 下载附件,解压,得md5宏.xla md5宏.zip 加载宏 依次打开[文件]-[选项]-[自定义功能 ...

  7. VC使用#定义方便控制版本号的宏

    一个 VC Project 中,可能有很多地方需要用到版本号,比如 About 对话框.版本资源等.如果每次版本更改都一一去改变这些值,不但非常麻烦,而且有悖唯一原则. 巧妙地使用宏定义,可以很好地解 ...

  8. EL表达式有无双引号的区别

    最近做项目时发现原来对EL表达式理解太浅,通过一个springMVC项目,加深了对其的理解,下面总结一下,如发现有不对之处,请批评指正: 1.在单独的js文件中,EL表达式无效,如:var type= ...

  9. 002-shell变量定义、使用、字符串、数组、注释

    一.变量定义 定义变量时,变量名不加美元符号($) name="lhx" 注意,变量名和等号之间不能有空格.同时,变量名的命名须遵循如下规则: 命名只能使用英文字母,数字和下划线, ...

随机推荐

  1. vue-router之路由钩子(组件内路由钩子必须在路由组件调用,子组件没用)

    模式 vue-router中的模式选项主要在router实例化的时候进行定义的,如下 const router = new VueRouter({ mode: 'history', // 两种类型hi ...

  2. github 推送代码

    一.所有更新一起推送 .git init //初始化本地仓库 . git add . //添加全部文件 .git commit -m 'add all the file' //提交修改 .git st ...

  3. laravel 接口跨域

    最方便的方法,新建一个middleWare,把这个middleware加入到全局中间件,所有的请求,都会经过这个中间件的过滤. php artisan make:middleware CrossHtt ...

  4. 兼容IE8以下,获取className节点的元素(document.getElementsByClassName()兼容写法)。

    因为ie8一下不兼容                 document.getElementsByClassName()                 功能:通过class的名字获取符合条件的元素 ...

  5. jmeter参数化、添加变量、生成随机数和导入csv文件数据

    Remarks:本次使用jmeter版本为4.0 以下数据都在必应中演示: 添加普通变量 1.添加 User Defined Variables(用户自定义变量) 2.设置变量 3.使用变量 4.查看 ...

  6. Spring集成shiro做登陆认证

    一.背景 其实很早的时候,就在项目中有使用到shiro做登陆认证,直到今天才又想起来这茬,自己抽空搭了一个spring+springmvc+mybatis和shiro进行集成的种子项目,当然里面还有很 ...

  7. Masm615+notepad++6.8.8搭建汇编开发环境

    前言:很早以前搭过,做了笔记的.现在重新玩汇编,按照笔记撘环境,谁知道坑了自己两个小时,气的我现在打字手都在抖 准备工作: 1.Masm615汇编环境,下载地址:https://pan.baidu.c ...

  8. webservice之restlet实现

    转自LifeBa,http://www.lifeba.org/arch/restlet_develop_application_component_2.html但有改动,主要改动有:1. 修改了web ...

  9. php手动搭建wamp环境(一)--之 Apache HTTP Servcer-Apache

    前言:因为之前为了快速进入工作(其实是懒!),所以一直使用集成环境 wampserver  或 phpstudy,傻瓜式安装使用卸载,配置也简单.但是最近新电脑突然想回顾一下手动安装,所以记录一下.搭 ...

  10. Android strings.xml中定义字符串显示空格

    <string name="str">字 符 串</string> 其中   就表示空格.如果直接在里面键入空格,无论多少空格都只会显示一个. 用的XML转 ...