You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:02:42