现代CMake高级教程 - 第 9 章:分支与判断

news/2024/11/16 4:13:31/

双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记

第 9 章:分支与判断

BOOL 类型的值

通常来说 BOOL 类型的变量只有 ON/OFF 两种取值。但是由于历史原因,TRUE/FALSE 和 YES/NO 也可以表示 BOOL 类型。个人建议同学们始终使用 ON/OFF 避免混淆。

  • https://stackoverflow.com/questions/41079291/cmake-use-of-true-false-or-on-off-or-yes-no-in-generator-expressions
  • https://cmake.org/cmake/help/v3.7/command/if.html

if

if 的特点:不需要加 ${},会自动尝试作为变量名求值

由于历史原因,if 的括号中有着特殊的语法,如果是一个字符串,比如 MYVAR,则他会先看是否有 ${MYVAR} 这个变量。如果有这个变量则会被替换为变量的值来进行接下来的比较,否则保持原来字符串不变。

CMakeLists:

set(MYVAR Hello)
if (MYVAR MATCHES "Hello")message("MYVAR is Hello")
else()message("MYVAR is not Hello")
endif()

生成结果:

MYVAR is Hello

如果我加了 ${} 会怎么样呢?

if (${MYVAR} MATCHES "Hello") 会被翻译成 if (Hello MATCHES "Hello")。但是因为找不到名为 Hello 的变量,所以会被直接当成普通的字符串来处理。

也就是 if ("Hello" MATCHES "Hello") 从而会执行真分支,结果正常。

set(MYVAR Hello)
if (${MYVAR} MATCHES "Hello")message("MYVAR is Hello")
else()message("MYVAR is not Hello")
endif()

生成结果:

MYVAR is Hello

万一好巧不巧,正好定义了 Hello 这个变量呢?

然而假如存在 Hello 这个变量,其值为 “world”。那么 if (${MYVAR} MATCHES "Hello") 会被翻译成 if (Hello MATCHES "Hello")。而因为 Hello 这个变量名存在,所以会被(出于历史原因的)if 进一步求值:if (“world” MATCHES "Hello") 从而会执行假分支,结果不正常了。

set(Hello world)
set(MYVAR Hello)
if (${MYVAR} MATCHES "Hello")message("MYVAR is Hello")
else()message("MYVAR is not Hello")
endif()

生成结果:

MYVAR is not Hello

解决:用引号包裹起来,防止被当做变量名。

初学者如果搞不明白,可以把所有不确定的地方都套上一层引号,例如 "${MYVAR}",这样就可以避免被 if 当做变量名来求值了。

set(Hello world)
set(MYVAR Hello)
if ("${MYVAR}" MATCHES "Hello")message("MYVAR is Hello")
else()message("MYVAR is not Hello")
endif()

生成结果:

MYVAR is Hello

http://www.ppmy.cn/news/60719.html

相关文章

云上网络规划CIDR地址划分的参考示例

CIDR规则 0000 0000. //预留 0000 0000. //region Id 区域,例如北京、上海 000 //vpc Id 区域内部不同子网,例如北京1机房、2机房0 0000. //vSwitch Id 可用区机房,例如北京1可用区机房1的交换机 0000 0000. //resoure Id 交换机下不…

【C++初阶】类和对象(二)

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C初阶 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【C初阶】…

力扣刷题Day12

239. 滑动窗口最大值 (此题逻辑真心牛皮) 做此题之前,首先明确此题的目的。我最开始没搞明白此题目的,看代码的时候卡死。 copy他人代码: from collections import dequeclass MyQueue: #单调队列(从大到小def __ini…

档案馆库房环境温湿度空气质量等相关要求

档案库房防潮工作,就是要将库内相对湿度控制在规定的范围之内,这个范围就是由建设部和国家档案局共同批准颁布的强制性行业标准《档案馆建设设计规范》对档案库房的温湿度范围已作出明确的要求:温度14℃~24℃,湿度45%&…

NECCS|全国大学生英语竞赛C类|词汇和语法|词汇题|21:03~21:53

词汇题 语法题 情景对话题 目录 一、词汇题 1. 基本词义辨析题 2. 同义词或近义词辨析题 3. 固定搭配 二、常见词组 一、词汇题 1. 基本词义辨析题 appropriate funds 拨款 slum- clearance programme 贫民窟清理计划 reject 拒绝接受&…

软件测试实战,Web测试详细总结 (覆盖所有测试点),你要的都有

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Web自动化测试&…

【并发编程】探索可见性背后的本质以及vloatile原理

文章目录 可见性造成不可见性的原因缓存一致性指令重排序 JMMvloatile原理Happens-Before模型案例说明 可见性 在单线程的环境下,如果向一个变量先写入一个值,然后在没有写干涉的情况下读取这个变量的值,那 这个时候读取到的这个变量的值应该…

Python非线性回归预测模型实验完整版

非线性回归预测模型 实验目的 通过非线性回归预测模型,掌握预测模型的建立和应用方法,了解非线性回归模型的基本原理 实验内容 非线性回归预测模型 实验步骤和过程 (1)第一步:学习非线性回归预测模型相关知识。 非线性回归预测模型是指…