[C++][CMake][流程控制]详细讲解

2024-07-08 898阅读

目录

  • 1.条件判断
    • 1.基本表达式
    • 2.逻辑判断
    • 3.比较
    • 4.文件操作
    • 5.其他
    • 2.循环
      • 1.foreach
      • 2.while

        1.条件判断

        • 在进行条件判断的时候,如果有多个条件,那么可以写多个elseif,最后一个条件可以使用else,但是开始和结束是必须要成对出现的,分别为:if和endif
        • 语法:
          if()
            
          elseif() # 可选快, 可以重复
            
          else()              # 可选快
            
          endif()
          

          1.基本表达式

          • 语法:
            if()
            
          • 如果是基本表达式,expression有以下三种情况:常量、变量、字符串
            • 如果是1, ON, YES, TRUE, Y, 非零值,非空字符串时,条件判断返回True
            • 如果是0, OFF, NO, FALSE, N, IGNORE, NOTFOUND,空字符串时,条件判断返回False

              2.逻辑判断

              • NOT:逻辑取反
                if(NOT )
                
              • AND:逻辑与
                if( AND )
                
              • OR:逻辑或
                if( OR )
                

                3.比较

                • 基于数值的比较
                  if( LESS )
                  if( GREATER )
                  if( EQUAL )
                  if( LESS_EQUAL )
                  if( GREATER_EQUAL )
                  
                • 基于字符串的比较
                  if( STRLESS )
                  if( STRGREATER )
                  if( STREQUAL )
                  if( STRLESS_EQUAL )
                  if( STRGREATER_EQUAL )
                  

                  4.文件操作

                  • 判断文件或者目录是否存在
                    if(EXISTS path-to-file-or-directory)
                    
                  • 判断是不是目录:此处path必须是绝对路径
                    if(IS_DIRECTORY path)
                    
                  • 判断是不是软链接:此处的file-name必须是绝对路径
                    if(IS_SYMLINK file-name)
                    
                  • 判断是不是绝对路径
                    if(IS_ABSOLUTE path)
                    

                    5.其他

                    • 判断某个元素是否在列表中:CMake版本要求 > 3.3
                      if( IN_LIST )
                      
                    • 比较两个路径是否相等:CMake版本要求 > 3.24
                      if( PATH_EQUAL )
                      
                      • 关于路径的比较其实就是两个字符串的比较,如果路径格式书写没有问题也可以通过下面这种方式进行比较
                        if( STREQUAL )
                        
                      • 在书写某个路径的时候,可能由于误操作会多写几个分隔符,比如把/a/b/c写成/a//b///c,此时通过STREQUAL对这两个字符串进行比较肯定是不相等的,但是通过PATH_EQUAL去比较两个路径,得到的结果确实相等的,可以看下面的例子:
                        cmake_minimum_required(VERSION 3.26)
                        project(test)
                        if("/home//robin///Linux" PATH_EQUAL "/home/robin/Linux")
                            message("路径相等") # √
                        else()
                            message("路径不相等")
                        endif()
                        message(STATUS "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
                        if("/home//robin///Linux" STREQUAL "/home/robin/Linux")
                            message("路径相等")
                        else()
                            message("路径不相等") # √
                        endif()
                        
                      • 结论:在进行路径比较的时候
                        • 如果使用PATH_EQUAL可以自动剔除路径中多余的分割线然后再进行路径的对比
                        • 使用STREQUAL则只能进行字符串比较

                          2.循环

                          1.foreach

                          • 通过foreach就可以对items中的数据进行遍历,然后通过loop_var将遍历到的当前的值取出
                          • 语法:
                            foreach( )
                                
                            endforeach()
                            
                          • loop_var在取值的时候有以下几种用法:
                            • foreach( RANGE )
                              • 参数:
                                • RANGE:关键字,表示要遍历范围
                                • stop:这是一个正整数,表示范围的结束值,[0, stop]
                                • loop_var:存储每次循环取出的值
                                • 示例:
                                  cmake_minimum_required(VERSION 3.2)
                                  project(test)
                                  foreach(item RANGE 10)
                                      message(STATUS "当前遍历的值为: ${item}" )
                                  endforeach()
                                  
                                • foreach( RANGE [])
                                  • 在遍历一个整数区间的时候,除了可以指定起始范围,还可以指定步长
                                  • 参数:
                                    • RANGE:关键字,表示要遍历范围
                                    • start:这是一个正整数,表示范围的起始值,也就是说最小值为start
                                    • stop:这是一个正整数,表示范围的结束值,也就是说最大值为stop
                                    • step:控制每次遍历的时候以怎样的步长增长,默认为1,可以不设置
                                    • loop_var:存储每次循环取出的值
                                    • 示例:
                                      cmake_minimum_required(VERSION 3.2)
                                      project(test)
                                      foreach(item RANGE 10 30 2)
                                          message(STATUS "当前遍历的值为: ${item}" )
                                      endforeach()
                                      
                                    • foreach( IN [LISTS []] [ITEMS []])
                                      • 这是foreach的另一个变体,通过这种方式可以对更加复杂的数据进行遍历,前两种方式只适用于对某个正整数范围内的遍历
                                      • 参数:
                                        • IN:关键字,表示在xxx里面
                                        • LISTS:关键字,对应的是列表list,通过set、list可以获得
                                        • ITEMS:关键字,对应的也是列表
                                        • loop_var:存储每次循环取出的值
                                        • 示例1:
                                          cmake_minimum_required(VERSION 3.2)
                                          project(test)
                                          # 创建 list
                                          set(WORD a b c d)
                                          set(NAME I am DieSnowK)
                                          # 遍历 list
                                          foreach(item IN LISTS WORD NAME)
                                              message(STATUS "当前遍历的值为: ${item}" )
                                          endforeach()
                                          
                                        • 结果1
                                          -- 当前遍历的值为: a
                                          -- 当前遍历的值为: b
                                          -- 当前遍历的值为: c
                                          -- 当前遍历的值为: d
                                          -- 当前遍历的值为: I
                                          -- 当前遍历的值为: am
                                          -- 当前遍历的值为: DieSnowK
                                          
                                        • 示例2
                                          cmake_minimum_required(VERSION 3.2)
                                          project(test)
                                          set(WORD a b c "d e f")
                                          set(NAME I am DieSnowK)
                                          foreach(item IN ITEMS ${WORD} ${NAME})
                                              message(STATUS "当前遍历的值为: ${item}" )
                                          endforeach()
                                          
                                        • 结果2
                                          -- 当前遍历的值为: a
                                          -- 当前遍历的值为: b
                                          -- 当前遍历的值为: c
                                          -- 当前遍历的值为: d e f
                                          -- 当前遍历的值为: I
                                          -- 当前遍历的值为: am
                                          -- 当前遍历的值为: DieSnowK
                                          
                                        • 两种示例的区别:
                                          • 遍历过程中将关键字LISTS改成了ITEMS,后边跟的还是一个或者多个列表
                                          • 只不过此时需要通过${}将列表中的值取出
                                          • foreach(... IN ZIP_LISTS )
                                            • 注意:CMake版本要求 > 3.17
                                            • 通过这种方式,遍历的还是一个或多个列表,可以理解为是方式3的加强版
                                              • 因为通过上面的方式遍历多个列表,但是又想把指定列表中的元素取出来使用是做不到的,在这个加强版中就可以轻松实现
                                              • 参数:
                                                • IN:关键字,表示在xxx里面
                                                • ZIP_LISTS:关键字,对应的是列表list,通过set、list可以获得
                                                • loop_var:存储每次循环取出的值,可以根据要遍历的列表的数量指定多个变量,用于存储对应的列表当前取出的那个值
                                                  • 如果指定了多个变量名,它们的数量应该和列表的数量相等
                                                  • 如果只给出了一个loop_var,那么它将一系列的loop_var_N变量来存储对应列表中的当前项
                                                    • loop_var_0对应第一个列表
                                                    • loop_var_1对应第二个列表
                                                    • 以此类推…
                                                    • 示例:
                                                      cmake_minimum_required(VERSION 3.17)
                                                      project(test)
                                                      # 通过list给列表添加数据
                                                      list(APPEND WORD Die SnowK "Die SnowK")
                                                      list(APPEND NAME I am Die SnowK haha)
                                                      # 遍历列表
                                                      foreach(item1 item2 IN ZIP_LISTS WORD NAME)
                                                          message(STATUS "当前遍历的值为: item1 = ${item1}, item2=${item2}" )
                                                      endforeach()
                                                      message("=============================")
                                                      # 遍历列表
                                                      foreach(item IN ZIP_LISTS WORD NAME)
                                                          message(STATUS "当前遍历的值为: item1 = ${item_0}, item2=${item_1}" )
                                                      endforeach()
                                                      
                                                    • 结果
                                                      -- 当前遍历的值为: item1 = Die, item2=I
                                                      -- 当前遍历的值为: item1 = SnowK, item2=am
                                                      -- 当前遍历的值为: item1 = Die SnowK, item2=Die
                                                      -- 当前遍历的值为: item1 = , item2=SnowK
                                                      -- 当前遍历的值为: item1 = , item2=haha
                                                      =============================
                                                      -- 当前遍历的值为: item1 = Die, item2=I
                                                      -- 当前遍历的值为: item1 = SnowK, item2=am
                                                      -- 当前遍历的值为: item1 = Die SnowK, item2=Die
                                                      -- 当前遍历的值为: item1 = , item2=SnowK
                                                      -- 当前遍历的值为: item1 = , item2=haha
                                                      

                                                      2.while

                                                      • 语法:循环结束对应的条件判断的书写格式和if/elseif是一样的
                                                        while()
                                                            
                                                        endwhile()
                                                        
                                                      • 示例:
                                                        cmake_minimum_required(VERSION 3.5)
                                                        project(test)
                                                            
                                                        # 创建一个列表 NAME
                                                        set(NAME I am Die SnowK haha)
                                                        # 得到列表长度
                                                        list(LENGTH NAME LEN)
                                                            
                                                        # 循环
                                                        while(${LEN} GREATER  0)
                                                            message(STATUS "names = ${NAME}")
                                                            # 弹出列表头部元素
                                                            list(POP_FRONT NAME)
                                                            # 更新列表长度
                                                            list(LENGTH NAME LEN)
                                                        endwhile()
                                                        
                                                      • 结果
                                                        -- names = I;am;Die;SnowK;haha
                                                        -- names = am;Die;SnowK;haha
                                                        -- names = Die;SnowK;haha
                                                        -- names = SnowK;haha
                                                        -- names = haha
                                                        
                                                      [C++][CMake][流程控制]详细讲解
                                                      (图片来源网络,侵删)
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]