为何CMake中第一个if判断为真、第二个为假?解析on的含义
CMake
if判断逻辑解析 测试代码
cmake_minimum_required(VERSION 3.20) set(on "OFF") if(on) message("ON") else() message("OFF") endif() if(${on}) message("ON") else() message("OFF") endif()
执行输出
$ cmake -P test.cmake ON OFF
CMake官方基础表达式规则
常量为1、ON、YES等时为真;为0、OFF、NO等时为假,命名布尔常量不区分大小写。若参数非特定常量则视为变量或字符串。
疑问与解答
你的理解大部分是对的,但得把on的本质说清楚:
- CMake的
if指令判断有优先级:先检查输入是否是不区分大小写的布尔常量(比如ON/OFF、YES/NO这类),如果匹配就直接按常量判断;如果不是,才会当作变量去解析它的值。 - 对于
if(on):这里的on被CMake优先识别成布尔常量ON(因为大小写不敏感),所以直接判定为真,输出ON——这部分你说的没错。 - 对于
if(${on}):${on}是变量展开语法,会先把你用set(on "OFF")定义的变量on的值(也就是"OFF")替换进来,变成if(OFF),此时OFF是布尔常量,判定为假,输出OFF——这部分你的理解也正确。 - 至于
on究竟是什么:你确实用set定义了一个名为on的变量,它的值是字符串"OFF"。但在if(on)的场景里,CMake的判断逻辑先匹配了布尔常量,根本没去读取这个变量的值。简单总结:直接写on时,它是布尔常量ON;用${on}时,才是你定义的那个值为OFF的变量。
内容的提问来源于stack exchange,提问作者neo742
相关产品推荐
相关产品推荐

