Cmake中的条件判断if/elseif/else

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cmake中的条件判断if/elseif/else相关的知识,希望对你有一定的参考价值。

参考技术A

   if 语句用于判断条件是否成立,条件成立时执行对应的语句。完整的格式如下:

   if 语句中条件( condition )的优先级从高到低如下:

   if 语句分为基本表达式、逻辑操作、存在性判断、文件操作、变量比较、版本号比较、变量展开几大类判定,下面依次以示例来介绍:

  文件的操作, CMake 官方文档中都要求使用全路径, if 判断的结果才是有明确定义的,相对路径可能无法识别(例如 ~ 不会解析成 home 目录)。

  比较操作可以分为三大类:1)正则表达式匹配;2)按数值大小;3)按字典序。

  数值比较有小于( LESS )、大于( GREATER )、等于( EQUAL )、大于等于( GREATER_EQUAL )、小于等于( LESS_EQUAL )五种。需要注意:比较的两个变量是有效的数值,例如100、200这些是有效数值,"100"、"200"也是有效数值,但是"a100"、"200c"就不是有效数值。如果任意一个不是有效数值,会返回 false 。

  数值比较有小于( STRLESS )、大于( STRGREATER )、等于( STREQUAL )、大于等于( STRGREATER_EQUAL )、小于等于( STRLESS_EQUAL )五种,注意不管是数还是字符串,都是 按照字典序进行比较

  版本号比较也有 VERSION_LESS 、 VERSION_GREATER 、 VERSION_EQUAL 、 VERSION_LESS_EQUAL 、 VERSION_GREATER_EQUAL 五种,需要注意两点:

  对于 if($var) 这种形式,很容易理解是要将变量 var 的值放到 if 中进行判断。但是由于在 CMake 中, if 表达式出现的比 $ 要早,因此早期对于 if(var) 这种形式, var 到底是按照变量还是值/字符串来解析? CMake 的做法是:首先看 var 是否是一个已经定义的变量,如果是,则需要将他的值替换到 if 中,否则就直把 var 当成一个字符串/值。
  来看一个例子:

  此处的 var 是一个已经定义好的变量,因此 if 判断转化为 if("NO") ,它会按照 if(<constant>) 最终的判定结果是 false ,因此上面的执行结果输出 false for NO 。如果没有 set(var "NO") 这句定义,那么 if 判断转为 if(<variable>) ,因为 变量不存在 而判定为 false 。

  来看一个稍微复杂一点的例子:

  在 if 命令执行之前, $var2 首先会执行,会替换成变量 var2 的值,因此变成 if(var) ,然后仍然会先去判断 var 是否是一个已经定义好的变量。因此后续的执行过程与上个例子一样。 if 判断转化为 if("NO") ,它会按照 if(<constant>) 最终的判定结果是 false ,输出 false for NO 。如果没有 set(var "NO") 这句赋值,那么 if 判断转为 if(<variable>) ,因为 变量不存在 而判定为 false 。当然,如果把 if($var2) 替换成 if(var2) ,会转化成 if("var") ,那么 if 判断转为 if(<string>) ,字符串结果判定为 true .

以上是关于Cmake中的条件判断if/elseif/else的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的条件语句if

CMake中if的使用

JS02

JavaScript条件语句和循环语句

CMake基础教程(14)条件语句if else书写

比较php中switch与if..elseif以及记录switch中的坑