[C++][CMake][流程控制]詳細講解

目錄

  • 1.條件判斷
    • 1.基本表達式
    • 2.邏輯判斷
    • 3.比較
    • 4.文件操作
    • 5.其他
  • 2.循環
    • 1.foreach
    • 2.while


1.條件判斷

  • 在進行條件判斷的時候,如果有多個條件,那么可以寫多個elseif,最后一個條件可以使用else,但是開始和結束是必須要成對出現的,分別為:ifendif
  • 語法
    if(<condition>)<commands>
    elseif(<condition>) # 可選快, 可以重復<commands>
    else()              # 可選快<commands>
    endif()
    

1.基本表達式

  • 語法
    if(<expression>)
    
  • 如果是基本表達式,expression有以下三種情況:常量、變量、字符串
    • 如果是1, ON, YES, TRUE, Y, 非零值非空字符串時,條件判斷返回True
    • 如果是0, OFF, NO, FALSE, N, IGNORE, NOTFOUND空字符串時,條件判斷返回False

2.邏輯判斷

  • NOT:邏輯取反
    if(NOT <condition>)
    
  • AND:邏輯與
    if(<cond1> AND <cond2>)
    
  • OR:邏輯或
    if(<cond1> OR <cond2>)
    

3.比較

  • 基于數值的比較
    if(<variable|string> LESS <variable|string>)
    if(<variable|string> GREATER <variable|string>)
    if(<variable|string> EQUAL <variable|string>)
    if(<variable|string> LESS_EQUAL <variable|string>)
    if(<variable|string> GREATER_EQUAL <variable|string>)
    
  • 基于字符串的比較
    if(<variable|string> STRLESS <variable|string>)
    if(<variable|string> STRGREATER <variable|string>)
    if(<variable|string> STREQUAL <variable|string>)
    if(<variable|string> STRLESS_EQUAL <variable|string>)
    if(<variable|string> STRGREATER_EQUAL <variable|string>)
    

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(<variable|string> IN_LIST <variable>)
    
  • 比較兩個路徑是否相等CMake版本要求 > 3.24
    if(<variable|string> PATH_EQUAL <variable|string>)
    
    • 關于路徑的比較其實就是兩個字符串的比較,如果路徑格式書寫沒有問題也可以通過下面這種方式進行比較
      if(<variable|string> STREQUAL <variable|string>)
      
    • 在書寫某個路徑的時候,可能由于誤操作會多寫幾個分隔符,比如把/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(<loop_var> <items>)<commands>
    endforeach()
    
  • loop_var在取值的時候有以下幾種用法:
    • foreach(<loop_var> RANGE <stop>)
      • 參數
        • RANGE:關鍵字,表示要遍歷范圍
        • stop:這是一個正整數,表示范圍的結束值[0, stop]
        • loop_var:存儲每次循環取出的值
      • 示例
        cmake_minimum_required(VERSION 3.2)
        project(test)foreach(item RANGE 10)message(STATUS "當前遍歷的值為: ${item}" )
        endforeach()
        
    • foreach(<loop_var> RANGE <start> <stop> [<step>])
      • 在遍歷一個整數區間的時候,除了可以指定起始范圍,還可以指定步長
      • 參數
        • 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(<loop_var> IN [LISTS [<lists>]] [ITEMS [<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(<loop_var>... IN ZIP_LISTS <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(<condition>)<commands>
    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
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41166.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WordPress常見問題及簡要說明

1. 如何安裝WordPress? 簡要說明&#xff1a;WordPress是一個流行的內容管理系統&#xff0c;可以幫助用戶快速搭建網站。安裝WordPress需要以下幾個步驟&#xff1a;下載WordPress安裝包、上傳到服務器、創建數據庫、配置數據庫信息、完成安裝。 2. 如何創建一個新的WordPr…

掌握電量脈搏:WebKit 電池狀態(Battery Status API)支持全解析

掌握電量脈搏&#xff1a;WebKit 電池狀態&#xff08;Battery Status API&#xff09;支持全解析 隨著移動設備的廣泛使用&#xff0c;Web 應用對設備的電池狀態信息的需求日益增長。Battery Status API 提供了一種方式&#xff0c;允許 Web 應用訪問設備的電池信息&#xff…

【反悔貪心 反悔堆】1642. 可以到達的最遠建筑

本文涉及知識點 反悔貪心 反悔堆 LeetCode1642. 可以到達的最遠建筑 給你一個整數數組 heights &#xff0c;表示建筑物的高度。另有一些磚塊 bricks 和梯子 ladders 。 你從建筑物 0 開始旅程&#xff0c;不斷向后面的建筑物移動&#xff0c;期間可能會用到磚塊或梯子。 當…

Spring Boot中的全局異常處理

Spring Boot中的全局異常處理 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討如何在Spring Boot應用中實現全局異常處理&#xff0c;這是保證應用…

VSCode, 請在windows下使用git bash終端

用vscode在windows下調測代碼&#xff0c;運行時默認打開的終端是windows的cmd&#xff0c;很不受我待見。畢竟習慣了linux&#xff0c;習慣了windows下的git bash風格。怎么辦&#xff1f; search&#xff0c;search&#xff0c;research。 先確保windows上安裝了git bash。…

MATLAB 2024b 更新了些什么?

MATLAB 2024b版本已經推出了預覽版&#xff0c;本期介紹一些MATLAB部分的主要的更新內容。 幫助瀏覽器被移除 在此前的版本&#xff0c;當我們從MATLAB中訪問幫助文檔時&#xff0c;默認會通過MATLAB的幫助瀏覽器&#xff08;Help browser&#xff09;。 2024b版本開始&…

【Unity數據交互】如何Unity中讀取Ecxel中的數據

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;元宇宙-秩沅 &#x1f468;?&#x1f4bb; hallo 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 秩沅 原創 &#x1f468;?&#x1f4bb; 專欄交流&#x1f9e7;&…

醫院掛號系統小程序的設計

管理員賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;患者管理&#xff0c;醫生管理&#xff0c;專家信息管理&#xff0c;科室管理&#xff0c;預約信息管理&#xff0c;系統管理 微信端賬號功能包括&#xff1a;系統首頁&#xff0c;專家信息&#xff0…

數據結構算法-排序(一)-冒泡排序

什么是冒泡排序 冒泡排序&#xff1a;在原數組中通過相鄰兩項元素的比較&#xff0c;交換而完成的排序算法。 算法核心 數組中相鄰兩項比較、交換。 算法復雜度 時間復雜度 實現一次排序找到最大值需要遍歷 n-1次(n為數組長度) 需要這樣的排序 n-1次。 需要 (n-1) * (n-1) —…

Java事務(Transaction)

Java事務&#xff08;Transaction&#xff09;是數據庫管理系統執行過程中的一個邏輯單位&#xff0c;由一個有限的數據庫操作序列組成&#xff0c;這些操作要么全部執行&#xff0c;要么全部不執行&#xff0c;是一個不可分割的工作單位。事務的引入主要是為了解決并發操作數據…

Unity中遇到“Input Button unload_long_back_btn is not setup”問題

當你在Unity中遇到“Input Button unload_long_back_btn is not setup”這個問題時&#xff0c;需要按照以下步驟進行處理&#xff1a; 1. 檢查按鈕名稱 確保你在代碼中使用的按鈕名稱&#xff08;unload_long_back_btn&#xff09;與Unity輸入管理器中的配置完全匹配。 2. …

[AIGC] ClickHouse分布式表與本地表的區別及如何查詢所有本地表記錄

在大規模數據處理和分析場景中&#xff0c;ClickHouse是一種高性能的列式數據庫管理系統。ClickHouse支持分布式表和本地表兩種表類型&#xff0c;本文將介紹這兩種表類型的區別&#xff0c;并探討如何建表以查詢所有本地表的記錄。 文章目錄 一、ClickHouse分布式表與本地表的…

【Linux進階】文件系統7——文件系統簡單操作

1.磁盤與目錄的容量 現在我們知道磁盤的整體數據是在超級區塊中&#xff0c;但是每個文件的容量則在inode 當中記載。 那在命令行模式下面該如何顯示這幾個數據&#xff1f;下面就讓我們來談一談這兩個命令&#xff1a; df&#xff1a;列出文件系統的整體磁盤使用量&#xf…

Poker Game, Run Fast

Poker Game, Run Fast 撲克&#xff1a;跑得快 分門別類&#xff1a; 單張從小到大默認 A < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K 跑得快&#xff1a;單張從小到大 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 &…

javaweb個人主頁設計(html+css+js)

目錄 1 前言和要求 1.1 前言 1.2 設計要求 2 預覽 2.1 主頁頁面 2.2 個人簡介 2.3 個人愛好 2.4 個人成績有代碼&#xff0c;但是圖片已省略&#xff0c;可以根據自己情況添加 2.5 收藏夾 3 代碼實現 3.1 主頁 3.2 個人簡介 3.3 個人愛好 3.4 個人成績&#xff…

大數據處理利器:Apache Spark編程基礎與實戰

"大數據處理利器&#xff1a;Apache Spark編程基礎與實戰" 是一個涵蓋了Apache Spark這一強大大數據處理框架的深入學習和實踐指南。Apache Spark是一個快速、通用、可擴展的大數據處理引擎&#xff0c;它提供了高級別的API用于大規模數據處理和分析。下面&#xff0…

求職成功率的算法,與葫蘆娃救爺爺的算法,有哪些相同與不同

1 本節概述 通過在B站百刷葫蘆娃這部兒時劇&#xff0c;我覺得可以從中梳理出一些算法&#xff0c;甚至可以用于求職這個場景。所以&#xff0c;大家可以隨便問我葫蘆娃的一些劇情和感悟&#xff0c;我都可以做一些回答。 2 葫蘆娃救爺爺有哪些算法可言&#xff1f; 我們知道…

身體(body)的覺醒

佛&#xff0c;是一個梵文的漢語音譯詞&#xff0c;指覺醒者。 何謂覺醒&#xff1f;什么的覺醒&#xff1f;其實很簡單&#xff0c;就是身體的覺醒。 佛的另一個名字&#xff0c;叫菩提&#xff0c;佛就是菩提&#xff0c;菩提老祖&#xff0c;就是佛祖。 body&#xff0c;即…

微服務: 初識 Spring Cloud

什么是微服務? 微服務就像把一個大公司拆成很多小部門&#xff0c;每個部門各自負責一塊業務。這樣一來&#xff0c;每個部門都可以獨立工作&#xff0c;即使一個部門出了問題&#xff0c;也不會影響整個公司運作。 什么是Spring Cloud? Spring Cloud 是一套工具包&#x…

Oracle RAC 19c 打補丁至最新版本-19.23.0.0.0

實驗環境-我是從19.0.0.0直接打到19.23.0.0.0&#xff0c;適合剛部署好的集群打補丁直接到最新版本。 查看當前環境 查詢集群中運行的 Oracle Clusterware 軟件的 activex 版 查詢本地節點上二進制文件中存儲的 Oracle Clusterware 軟件的版本 查詢本地服務器上 OHAS 和 Oracle…