2021年1月

C4P持续更新中。

这次是看到转义字符列表里,对问号?也提供了转义序列\?,但是并没有解释其来由。当时就比较好奇,直接开了个源文件,试了一下,发现不论是printf还是cout,都直接正常地输出了问号字符。

后来在CSDN论坛上发现,有人也提出了相同的问题,下面的解答中提到了三字母词trigraphs这个概念。

以下介绍摘自中文wiki:

因为法国标准AFNOR NF Z 62010-1982把码位0x7c(ASCII码的 | )定义为ù,用法文键盘就难以输入C语言的位或运算符|;码位0x7e(ASCII码的~)定义为¨(即分音符),法文键盘就难以输入C语言的位非运算符~

加拿大法语标准CSA Z243.4-1985中把码位0x5e(ASCII码的^)在定义为É,导致难以输入C语言的异或运算符^

为解决上述的C语言源代码输入问题,C语言标准规定预处理器(C preprocessor)在扫描处理C语言源文件时,替换下述的3字符出现为1个字符:

三字符组 替换为
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

不过现在,各国经济水平发达了,这种问题只需要通过在键盘上多加几个按键就能解决(纯属口胡,有误欢迎指正),所以现在的编译器默认都不会开启三字母词,输入??=的输出也还是??=,不过会给出如下提示:

warning: trigraph ??= ignored, use -trigraphs to enable [-Wtrigraphs]

亦即,想要开启三字母词的话,在编译命令加上-trigraphs即可。

呜呜呜,C语言白学了.jpg

今天看C4P(C++ Primer Plus)才发现两个东西:

  1. define不是全文替换,而是单词替换;

假设有如下代码段:

#include ...
#define test "sss"
...
    char s[] = test;
    float tested = 1;
    printf("%s test\n", s);
...

输出是sss test而不是sss "sss"。(C++支持连续字符串自动拼接) (如果要验证define会不会替换变量名的话,得要至少两个文件才行)

  1. C语言的字符常量是按照int大小(通常是4Bytes)存储的。C++早期也是,后来才改成了和char一致的大小(按int存储的话会导致cout以数字形式输出字符常量的ASCII码)。

因为最近要用到YCSB,需要了解其中的工作原理,因而被迫RTFSC

虽然YCSB使用Java实现,我之前也用Java写过简单的SpringBoot,但当时也只是简单的处理依赖关系,骚操作没有YCSB这么多,因而这也算是第一次正式地使用Maven了。

POM,Project Object Model,顾名思义,可以理解为对当前项目的“建模”,实现上采用了XML文件的形式来描述项目的结构,包括项目名、版本、以及其他和C/C++项目类似的文件结构的定义(源码、库、资源文件等)。

简要介绍一下常用,但网上解释不是很清晰的的XML块(补充性质):

  • profiles profiles中可以有多个profile,每个profile由一个id和一组properties组成,若当前profile和id对应的时候,当前的properties就被激活。属性在properties中以<key>value</key>的XML格式声明,使用时用类shell的${}操作符包裹key以获取属性值。(平时XML用得少,不是很习惯这种写法)

  • assembly 一开始以为是汇编,存放的是什么低级字节码一类的,后来发现是打包,= = 在此可以声明自定义规则,format(s)块用于声明打包文件类型,fileSet(s)声明主要文件映射,dependencySet(s)声明依赖文件映射。这里的映射是指源文件目录结构到压缩文件目录结构之间的,动作是将指定文件添加入压缩文件。directoryoutputDirectoryinclude(s)依次声明一个fileSet所指向的目录、所要包含的文件和目标路径。

又到了每年闲下来,嚷嚷着要开坑新项目的季节了。然而仔细一想,去年挖坑说是要填的CHIP8还没有动手呢。

你怎么回事,小老弟.jpg

然而不得不承认的是,打开Visual Studio,创建好一个名为CHIP8的项目,可以说是人类历史上的一大壮举了。俗话说的好,良好的开端是成功的一半嘛。(大雾)

经历了今年整个冬春COVID的闭门不出,一个夏天的人心惶惶,一个秋天的摸爬滚打,让人感慨万千。又到了冬天,而一切又总算是回到了正轨。好在功夫不负有心人,过去几年的努力没有白费,未来几年总算不愁没饭吃了。

回到正题,Qt的部署方式和常规的应用开发是有区别的。普通应用的开发,只要把依赖库按照编译时的需求配置好,环境变量配置好,就可以带着到处跑。

但是Qt不行,如果按照传统思维的缺啥补啥的思路的话,Qt反而会报错,提示类似Qt安装损坏的信息。

后来到网上搜索后发现,Qt是有一套平台部署工具的(https://doc.qt.io/qt-5/windows-deployment.html),按照里面的说明,执行`windeployqt.exe`,即可自动完成应用部署。部署完成后,目标目录下会出现一大堆依赖文件,跟随应用一起打包即可

让Visual Studio在每次编译完成后自动部署Qt应用的方法是,右键项目->生成事件->生成后事件,在此可以利用Visual Studio的内置变量辅助完成自动部署指令的编写。可以理解为,在这里执行的命令行是通过cmd.exe执行的,因而需要使用CMD语法。

Release配置文件下的命令可以写成如下形式:

"$(QMake_QT_HOST_BINS_)/windeployqt.exe" --release "$(TargetPath)"

需要注意一下的是,如果不使用--dir选项指定为文件夹形式(让windeployqt.exe自行搜索Qt可执行文件)的话,$(TargetPath)位置需要填写项目的Qt可执行文件位置。