預處理指令中#if 和 #endif的用法

在 C 語言中,#if#endif預處理指令,用于條件編譯。它們的核心作用是:根據預處理器能夠識別的條件(通常是宏定義或常量表達式),決定某段代碼是否參與編譯。

在這里插入圖片描述

基本功能

  1. #if
    用于開啟一個條件編譯塊,其后必須是一個常量表達式(可以是宏定義或字面值)。
    如果表達式結果為非零值(邏輯“真”),則編譯 #if#endif 之間的代碼;否則直接忽略這段代碼。

  2. #endif
    標記條件編譯塊的結束。


典型用途

  1. 根據宏定義選擇性編譯代碼

    #define DEBUG 1#if DEBUGprintf("Debug信息: x = %d\n", x); // 只有 DEBUG 非零時,此代碼才會被編譯
    #endif
    
  2. 跨平臺代碼適配

    #if defined(_WIN32)// Windows 平臺專用代碼#include <windows.h>
    #elif defined(__linux__)// Linux 平臺專用代碼#include <unistd.h>
    #endif
    
  3. 功能開關控制

    #define USE_FEATURE_A 1#if USE_FEATURE_A// 啟用功能 A 的代碼
    #else// 替代功能的代碼
    #endif
    

與其他指令的配合

  • #elif:類似 else if,用于多分支條件:

    #if OS == 1// ...
    #elif OS == 2// ...
    #endif
    
  • #else:提供備選代碼:

    #if defined(OPTION)// ...
    #else// ...
    #endif
    
  • defined():檢查宏是否已定義:

    #if defined(DEBUG) && (VERSION > 5)// 當 DEBUG 已定義且 VERSION > 5 時編譯
    #endif
    

注意事項

  1. 條件必須是預處理器可計算的
    表達式中的宏需在之前定義,且只能包含整數常量、字符常量和 defined() 操作符。

  2. #ifdef/#ifndef 的區別

    • #ifdef MACRO 等價于 #if defined(MACRO)
    • #ifndef MACRO 等價于 #if !defined(MACRO)
  3. 代碼被完全排除
    如果條件不滿足,#if#endif 之間的代碼不會進入編譯階段(如同被刪除)。


示例

#include <stdio.h>#define VERSION 3int main() {#if VERSION >= 3printf("高級功能已啟用\n"); // VERSION >=3 時編譯此代碼#elseprintf("基礎功能\n");#endifreturn 0;
}

VERSION 定義為 3 或更高時,輸出 高級功能已啟用;否則輸出 基礎功能


通過 #if#endif,開發者可以靈活控制代碼在不同場景下的編譯行為,是 C 語言中管理代碼兼容性、調試和功能開關的重要工具。

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

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

相關文章

【數據庫】掌握MySQL事務與鎖機制-數據一致性的關鍵

在數據庫的世界里&#xff0c;數據就是一切。而確保數據的準確性和一致性&#xff0c;則是數據庫系統的核心任務之一。想象一下&#xff0c;如果沒有合適的機制&#xff0c;當多個用戶同時試圖修改同一條數據時&#xff0c;會發生什么&#xff1f; chaos&#xff08;混亂&#…

linux 基礎網絡配置文件

使用“ifconfig”命令查看網絡接口地址 直接執行“iconfg”命令后可以看到ens33、10、virbr0這3個網絡接口的信息&#xff0c;具體命令如下 ifconfig ##查看網絡接口地址 ens33:第一塊以太網卡的名稱 lo:“回環”網絡接口 virbr0:虛擬網橋的連接接口 查看指…

OpenCV特征提取與深度學習CNN特征提取差異

一、特征生成方式 ?OpenCV傳統方法? ?手工設計特征?&#xff1a;依賴人工設計的算法&#xff08;如SIFT、FAST、BRIEF&#xff09;提取圖像中的角點、邊緣等低層次特征&#xff0c;需手動調整參數以適應不同場景?。?數學驅動?&#xff1a;基于梯度變化、幾何變換等數學規…

五種方案實現雙鏈路可靠數據傳輸

本文介紹五種雙鏈路數據傳輸方案,目標是利用設備的多個傳輸通道,(如雙有線網口,網口+wifi, 網口+5G等場景 , 網口+ 自組網, 自組網 + 5G等),將數據復制后分流、分路同時傳輸,以期提高數據傳輸可靠性,滿足高可靠性傳輸的應用場景需求。部分方案給出了實際驗證結果 。 …

【備賽】遇到的小問題-1

問題描述-1 想實現的功能是&#xff0c;通過ADC實時測量某引腳的電壓及其占空比。 可以通過旋轉電位器&#xff0c;更改其電壓。 首先我定義了這幾個變量 uint32_t adc_value;//HAL庫函數里面得出的采樣值(實時更新) uint32_t percentage6;//占空比&#xff0c;隨著adc_val…

最大公約數

4.最大公約數 - 藍橋云課 最大公約數 題目描述 給定兩個正整數 A,B&#xff0c;求它們的最大公約數。 輸入描述 第1行為一個整數 T&#xff0c;表示測試數據數量。 接下來的 T 行每行包含兩個正整數 A,B。 1≤T≤105&#xff0c;1≤A,B≤109。 輸出描述 輸出共 T 行&…

TMHMM2.0-蛋白跨膜螺旋預測工具-centos-安裝+配置+排錯

參考&#xff1a; A. Krogh, B. Larsson, G. von Heijne, and E. L. L. Sonnhammer. Predicting transmembrane protein topology with a hidden Markov model: Application to complete genomes. Journal of Molecular Biology, 305(3):567-580, January 2001. centos&#x…

docker run 命令常用參數

docker run 命令 用于從鏡像創建并啟動一個新的容器。 基本語法&#xff1a; docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用選項分類說明 容器配置 --name 為容器指定名稱&#xff08;默認隨機生成&#xff09;。 示例&#xff1a; docker run --name my_container …

Zbrush插件安裝

安裝目錄在: ...\Zbrush2022\ZStartup\ZPlugs64

pandas中excel自定義單元格顏色

writerpd.ExcelWriter(filepathf05教師固定學生占比1月{today}.xlsx,engineopenpyxl) df.to_excel(writer,sheet_name明細) piv1.to_excel(writer,sheet_name1月分布) wswriter.book.create_sheet(口徑) ws.cell(1,1).value綜合占比&#xff1a; ws.cell(1,2).value固定學生占比…

整體二分算法講解及例題

算法思想 整體二分&#xff0c;帶有二分二字那么就一定和二分脫不了干系。 整體二分算法常用來解決詢問區間的第 k k k小值的問題&#xff0c;思路如下&#xff1a; 我們二分的對象是這道題目給定的值域&#xff0c;及最小值與最大值之間的區間&#xff0c;在題目給定的數組中…

python+flask實現360全景圖和stl等多種格式模型瀏覽

1. 安裝依賴 pip install flask 2. 創建Flask應用 創建一個基本的Flask應用&#xff0c;并設置路由來處理不同的文件類型。 from flask import Flask, render_template, send_from_directory app Flask(__name__) # 設置靜態文件路徑 app.static_folder static app.r…

XML轉義符詳解:如何在XML中正確處理特殊字符

在XML中&#xff0c;某些字符具有特殊含義&#xff0c;如果直接在文本中使用這些字符&#xff0c;可能會導致XML解析錯誤。為了避免這些問題&#xff0c;我們需要使用XML轉義符或CDATA段來處理這些特殊字符。本文將詳細介紹XML轉義符的使用方法、注意事項&#xff0c;并結合實際…

IPC 進程間通信(一):管道(匿名管道進程池)

1. 初識進程間通信 1.1進程間通信的目的&#xff1a; 1、數據傳輸&#xff1a;一個進程需要將它的數據發送給另一個進程 2、資源共享&#xff1a;多個進程之間共享同樣的資源 3、通知事件&#xff1a;一個進程需要向另一個或一組進程發送消息&#xff0c;通知它&#xff08;它…

Linux-數據結構-單鏈表練習-雙鏈表

一.單鏈表練習和一些功能實現 【1】單鏈表實現字典查詢 &#xff08;1&#xff09;定義存放數據的結構體&#xff0c;在每次向里面存放數據時候需要清空 &#xff08;2&#xff09;對字典進行切割 空格切割字母&#xff0c;再從剩余里切割到解釋&#xff0c;這里windows的txt文…

網絡爬蟲相關

一、爬蟲的基礎內容 1、基本概念和用途 1.1、概念&#xff1a; 模擬瀏覽器、發送請求&#xff0c;獲取響應。&#xff08;只能獲取客戶端所展示出來的數據&#xff09; 1.2、特點&#xff1a;知識碎片化&#xff0c;針對不同的網站對應的方法也不同。 爬蟲&#xff1a;模擬…

Lora 中 怎么 實現 矩陣壓縮

Lora 中 怎么 實現 矩陣壓縮 1. 導入必要的庫 import torch import re from datasets import Dataset from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, \get_cosine_schedule_with_warmup, EarlyStoppingCallback from peft

golang-嵌套結構體

結構體嵌套 golang中沒有類&#xff0c;他通過結構體來實現其他編程語言中類的相關功能。 具名結構體 基本語法 基本語法 golang的結構體嵌套特別簡單。 type 結構體類型1 struct{字段 類型1字段 類型2 }//這樣就實現了結構體的嵌套 type 結構體類型2 struct{字段 類型1字…

基于Spring Boot的大學校園生活信息平臺的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

【 利用socket來實現簡單遠控】

利用socket來實現簡單遠控 &#x1f539; 免責聲明?? 重要提示一、什么是socket&#xff1f;二、如何使用socket來實現兩臺計算機之間的通信&#xff1f;服務端1、首先需要創建一個socket&#xff1b;2、綁定IP以及端口3、開啟監聽4、接受客戶端連接5、客戶端連接上之后就是命…