CMakeLists.txt语法规则:条件判断中表达式说明一

一. 简介

前面学习了 CMakeLists.txt语法中的 部分常用命令,常量变量,双引号的使用。

前面一篇文章也简单了解了 CMakeLists.txt语法中的条件判断,文章如下:

CMakeLists.txt语法规则:条件判断说明一-CSDN博客

本文继续学习 CMakeLists.txt语法中的条件判断,主要学习 条件判断中的 表达式。

二. CMakeLists.txt语法规则:条件判断中的表达式

前一篇文章简单了解了 CMakeLists.txt语法中条件判断,本文对条件判断中表达式进行学习。

1. <constant> 表达式

在 if(constant)条件判断中,如果 constant 是 1、ON、YES、TRUE、Y 或非零数字,那么这个 if 条件就 是 true;
如果 constant 是 0、OFF、NO、FALSE、N、IGNORE、NOTFOUND、空字符串或以后缀-NOTFOUND 结尾,那么这个条件判断的结果就是 false。
在 cmake 中,可以把 1、ON、YES、TRUE、Y 或非零数字以及 0、OFF、NO、FALSE、N、IGNORE、 NOTFOUND、空字符串或以后缀-NOTFOUND 结尾这些理解为常量,类似于布尔值,而且它们不区分大小写;
如果参数不是这些特定常量之一,则将其视为变量或字符串,并使用除<constant>之外的表达式。

复制代码
if(ON)
message(true)
else()
message(false)
endif()

输出为:true 。

同理,当 if(ON) 判断替换为 if(YES) 、if(true) 、if(100) 等非 0数字,输出都为 true。

复制代码
if(0)
message(true)
else()
message(false)
endif()

输出为:false

同理,当 if(0) 判断替换为 if(N) 、if(NO)时,输出也是 输出为:false 。

2. <variable/string> 表达式

在 if(<variable/string>)条件判断中,如果变量已经定义,并且它的值是一个非假常量,则条件为真;否则为假。
注意宏参数不是变量(在 cmake 中也可以使用宏,这个后面再给大家介绍)。

复制代码
输出为:true
set(GG Hello)
if(GG)
message(true)
else()
message(false)
endif()

输出为:false
set(GG NO)
if(GG)
message(true)
else()
message(false)
endif()

输出为:false
if(GG)
message(true)
else()
message(false)
endif()

3. NOT <expression> 表达式

NOT 其实就类似于 C 语言中的取反,在 if(NOT <expression>) 条件判断中,如果表达式 expression 为真,则条件判断为假;如果表达式 expression 为假,则条件判断为真。

复制代码
if(NOT GG)
message(true)
else()
message(false)
endif()

输出为: true
因为 GG 变量没有定义,所以 GG 表达式为假,但因为前面有 NOT 关键字,进行取反操作,整个 if 条件判断为真。

复制代码
输出为:false
if(NOT YES)
message(true)
else()
message(false)
endif()

输出为:true
if(NOT 0)
message(true)
else()
message(false)
endif()

4. <expr1> AND <expr2>表达式

这个就类似于 C 语言中的逻辑与( && ),只有 expr1 和 expr2 同时为真时,条件判断才为真;否则条件判断为假。

复制代码
输出为:true
if(yes AND on)
message(true)
else()
message(false)
endif()

#输出为:false
if(yes AND no)
message(true)
else()
message(false)
endif()       

输出为:false
if(false AND no)
message(true)
else()
message(false)
endif()

下一篇文章继续学习 条件判断中的表达式。

相关推荐
comedate3 小时前
Windows / Linux GPU 虚拟内存布局差异与 CUDA 越界访问行为
linux·windows·mmu·cuda 越界访问
暴力求解5 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
ltl6 小时前
序列化格式深度对比:Protobuf、FlatBuffers、Cap’n Proto
linux
lengjingzju6 小时前
编译与调试完全指南—第17章 总结
linux
ltl6 小时前
容器网络性能真相:veth vs macvlan vs eBPF 数据面
linux
我不会插花弄玉7 小时前
9.进程间通信(上)【由浅入深-Linux】
linux·共享内存·进程通信
CSDN121108 小时前
麒麟 V10 安装 Node-RED、IEC 104 协议插件及界面汉化
linux·编辑器·vim
晨枫阳10 小时前
@changesets/cli是什么?哪些情况下需要使用?怎么使用
linux·运维·ubuntu
不会就选b11 小时前
Linux之网络基础(二)
linux·运维·网络
莫浅子11 小时前
Day 4:USB 2.0 时序与带宽预算
linux·运维·网络