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
如果常量为 1、ON、YES、TRUE、Y 或非零数字(包括浮点数),则为 True。如果常量为 0、OFF、NO、FALSE、N、IGNORE、NOTFOUND、空字符串或以 -NOTFOUND 为后缀,则为 False。命名布尔常量不区分大小写。如果参数不是这些特定常量之一,则将其视为变量或字符串(参见下文的变量扩展),并采用以下两种形式之一。
我对这个问题的理解是
对于预定义常量 ON,它相当于 on。
对于if(on)
,on
将被解析为预定义常量ON
。
对于if(${on})
,${on}
将被解析为“OFF”,相当于OFF
。
不知道我的理解是否正确。
什么是on
?
它是一个由两个字符组成的字符串。
所有CMake 变量都是字符串(或列表,即用分号分隔的字符串)。变量的解释取决于上下文。
您已经引用了CMake 文档
if
中关于 的正确部分。它指出,如果参数(以及其他属性)不区分大小写ON
,则它是一个常量,并计算结果为“true”。如果它不是任何魔法常量,则它将被视为变量或字符串。但是,您的示例从未达到这一点。关于变量扩展的部分指出,
${}
求值发生在参数之前。它还提供了一个与您的示例非常相似的示例,只是它使用的变量名更简洁易懂。if
总结一下:
on
常数。ON
${on}
经过变量扩展成为字符串OFF
。然后,它被输入到条件语句中,成为结果if(OFF)
为 false 的字符串,因为OFF
它是魔法常量之一。on
它将分别被if
或 之前求值,并被求值。if
解决方案:不要使用常量名称作为变量名。像这样的语句
set(on OFF)
看起来像是故意混淆。