qmake奇淫技巧之字符串宏定义
阅读本文大概需要3.3分钟
我们平时在软件开发过程中需要定义一些宏,以便在代码中调用,这样每次不需要修改代码,只需要修改外部编译命令就可以得到想要的参数,非常方便
比如我们想在软件介绍中显示软件版本,让别人知道当前使用的软件是那个版本,一般会怎么做呢?
- 直接在代码中写死,版本号是多少
- 从外部配置读取显示
- 编译的时候通过编译条件读取,然后代码中读取对应变量值
今天看看平时使用最多的 Qt Creator
是怎么处理的
随便打开 Qt Creator
的关于软件可以看到
通过阅读源码就可以很清楚的知道,Qt Creator
是通过在 Pro
配置文件中定义宏,然后在源代码中直接读取显示的
下面来简单说说如何实现,主要包含下面几个过程
- 在
pro
文件中定义字符串宏 - 宏定义字符串
- 在源码中直接调用
感兴趣的朋友可以下载 Qt Creator
源码详细查看,墙裂学习 C++
的朋友去读读源码,真的可以让你学到很多意想不到的知识
pro 定义字符串宏
我们打开源码 qtcreator.pri
文件,就可以看到关于版本号的定义
QTCREATOR_VERSION = 4.4.1
上面 QTCREATOR_VERSION
变量定义了一个版本号,在其他配置文件中也可以直接读取该变量
但是,仅仅定义一个变量是不够的,在源码中是无法读取到的,直接编译会报错
宏定义字符串
宏定义就是这样一个简单语句
DEFINES += QTCREATOR_VERSION=\"\\\"$$QTCREATOR_VERSION\\\"\"
在搞清楚上述语法之前,必须要知道反斜杠转义的知识 反斜杠转义
\\(对反斜杠转义)
\[(对中括号转义)
\{(对花括号转义)
\.(对点转义)
说明
- 第一个反斜杠+引号(首尾成对),表示要对引号转义,告诉
qmake
里面是一个字符串; - 第二个反斜杠对(2个连续反斜杠),也是转义,表示对反斜杠本身进行转义,最终在
makefile
中变成一个反斜杠 - 第三个反斜杠+引号是对引号进行转义,表示里面最终是一个字符串
因此,上述语句最终会生成一个字符串,后面我们直接可以使用该字符串宏
在源码中直接调用
#include "Widget.h"
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug() << APP_NAME << QTCREATOR_VERSION;
return a.exec();
}
debug out
QtCreator 4.4.1
很轻松就可以定义字符串宏在代码中使用,这个技巧还是很方便的
总结
在定义字符串宏的时候一定要注意,你要定义的字符串是否包含空格,如果没有空格,还可以简单这样写
DEFINES += APP_NAME=\\\"QtCreator\\\"
这是为什呢?我们通过 makefile
文件可以发现,如果你的字符串包含空格,那么处理后会是这个样子
-DAPP_NAME=\"QtCreator -D\"
qmake
在处理时后面多加了一个 -D
,进而出现错误
<command-line>:0:10: warning: missing terminating " character
正确的 makefile
文件处理过程
DEFINES = -DUNICODE -DQTCREATOR_VERSION="\"4.4.1\"" -DAPP_NAME=\"QtCreator\"
......
后续关于 Qt Creator
源码分析会有一个系列进行总结,尽请关注
Qt Creator
代码是开源的,感兴趣的可以直接去下载阅读
qmake奇淫技巧之字符串宏定义的更多相关文章
- C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员
1.在C语言中,是将字符串作为字符数组来处理的,字符串是逐个存放到数组元素中的 例如用一个一维的字符数组存放字符串"I am a boy.",如下代码: char c[12] = ...
- Zepto源码分析(二)奇淫技巧总结
Zepto源码分析(一)核心代码分析 Zepto源码分析(二)奇淫技巧总结 目录 * 前言 * 短路操作符 * 参数重载(参数个数重载) * 参数重载(参数类型重载) * CSS操作 * 获取属性值的 ...
- Gradle更小、更快构建APP的奇淫技巧
本文已获得原作者授权同意,翻译以及转载原文链接:Build your Android app Faster and Smaller than ever作者:Jirawatee译文链接:Gradle更小 ...
- JavaScript 系列--JavaScript一些奇淫技巧的实现方法(二)数字格式化 1234567890转1,234,567,890;argruments 对象(类数组)转换成数组
一.前言 之前写了一篇文章:JavaScript 系列--JavaScript一些奇淫技巧的实现方法(一)简短的sleep函数,获取时间戳 https://www.mwcxs.top/page/746 ...
- ASP.NET Core 奇淫技巧之伪属性注入
一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变 ...
- 优化DP的奇淫技巧
DP是搞OI不可不学的算法.一些丧心病狂的出题人不满足于裸的DP,一定要加上优化才能A掉. 故下面记录一些优化DP的奇淫技巧. OJ 1326 裸的状态方程很好推. f[i]=max(f[j]+sum ...
- 12个实用的 Javascript 奇淫技巧
这里分享12个实用的 Javascript 奇淫技巧.JavaScript自1995年诞生以来已过去了16个年头,如今全世界无数的网页在依靠她完成各种关键任务,JavaScript曾在Tiobe发布的 ...
- NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC)
NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC) ARGUS 1月13日 发布 推荐 0 推荐 收藏 2 收藏,1.1k 浏览 文章整理中...... 实现思路 当服务器接收 ...
- NGINX的奇淫技巧 —— 3. 不同域名输出不同伺服器标识
NGINX的奇淫技巧 —— 3. 不同域名输出不同伺服器标识 ARGUS 1月13日 发布 推荐 0 推荐 收藏 6 收藏,707 浏览 大家或许会有这种奇葩的需求...要是同一台主机上, 需要针对不 ...
随机推荐
- collectd+infludb+grafana实现tomcat JVM监控
前提条件:已安装好java环境,tomcat,influxdb和collectd.本文暂不提供以上内容的安装步骤 系统环境:centos7 原理:开启tomcat的jmx端口,使用collectd的c ...
- 「 洛谷 」P4539 [SCOI2006]zh_tree
小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...
- LLVM程序分析日记之插桩BranchInst
1. splitblockandinsertifthenelse() 一个代码例子:StackOverflow 2. SplitBlockAndInsertIfThen() 或者仅仅想插桩if the ...
- Collections.synchronizedList 并发
1.背景 集合类中的map,大家一定熟悉,知道它非线程安全.使用的方法有两种,一种是在map上加同步器(锁),另一种是创建容器时使用Collections中的静态方法对map进行包装. java ap ...
- JavaScript判断视频编码是否为h.264
1.视频编码是什么? 现在视频编码主流是h.264,对应着输入格式为AVC H.264/AVC是2003年制定的视频编码压缩标准 ,集中了以往标准的优点,并吸收了以往标准制定中积累的经验,采用简洁设计 ...
- #2020征文-手机#深鸿会深大小组:HarmonyOS手机游戏—数字华容道
目录: 前言 概述 正文 创建项目 实现初始界面布局 实现数字的随机打乱 实现滑动或点击调换数字 实现游戏成功界面 结语 源码包 前言 12月16号HarmonyOS2.0手机开发者Beta版已经发布 ...
- VSCode---REST Client接口测试辅助工具
我们一般都会用 PostMan 来完成接口测试的工作,因为用起来十分简单快捷,但是一直以来我也在寻找更好的方案,一个不用切换窗口多开一个 app 的方案 -- 终于在使用 VSCode 一段时版本间, ...
- 用Python写个开心消消乐小游戏
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...
- Js 添加cookie,写入cookie到主域
if (getCookie("content") != null && getCookie("content") != "" ...
- Excel 多/整列(多/整行)移位操作
步骤1:创建测试数据 步骤2:把B列和C列进行移位操作(整列移位操作,多列移位操作方法一样) 选中B列,鼠标放到B列边缘地带,直到鼠标显示带有四个箭头方向为止,点击键盘shift键进行拖拽,拖拽时显示 ...