【C語言】條件編譯

🦄個人主頁:修修修也

🎏所屬專欄:C語言

??操作環境:Visual Studio 2022


目錄

條件編譯

常用的預處理指令

核心應用場景

1.防止頭文件重復包含

2.跨平臺兼容性

3.調試模式與發布模式

4.功能開關

5.代碼兼容性處理

結語


條件編譯

??????? 一般情況下,源程序中所有的代碼行都參與編譯。但有時希望對其中一部分內容只在滿足一定條件才進行編譯, 也就是對一部分內容指定編譯的條件, 這就是"條件編譯"。有時, 希望當滿足某條件時對一組語句進行編譯, 而當條件不滿足時則編譯另一組語句。

  • 作用階段:發生在預處理階段(編譯前),而非運行時。

  • 核心目標:根據不同場景(如平臺、配置、調試模式)編譯不同代碼,提升代碼的靈活性和可移植性。

常用的預處理指令

條件編譯指令說明
#if如果條件為真, 則執行后續相應操作
#elif如果前面條件為假, 該條件為真, 則執行相應操作
#else如果前面條件均為假, 則執行相應操作
#endif結束相應的條件編譯指令
#ifdef如果該宏已經定義, 則執行相應操作
#ifndef如果該宏沒有定義, 則執行相應操作

核心應用場景

1.防止頭文件重復包含

????????這是條件編譯最常見的用途,避免因多次包含同一頭文件導致的重復聲明錯誤。

//如在myheader.h頭文件中
#ifndef MYHEADER_H
#define MYHEADER_H//頭文件內容...
//...#endif

??????? 使用示例,如:

??????? 原理是當我們在外部再次包含這個頭文件時,預處理時會把這個頭文件展開, 展開時如果前面沒有定義TEST_H, 那么會執行后面定義的操作并展開頭文件。一旦前面定義了這個TEST_H, 那么后面就不會再重復定義了,自然后面重復包含的頭文件也不會展開了。所以可以防止頭文件重復包含。

??????? 但是現在一般使用#pragma once來替代傳統的頭文件保護。優點是更簡潔, 不需要維護宏名稱。缺點是:非標準特性, 少數舊編譯器不支持。


2.跨平臺兼容性

????????根據操作系統或硬件平臺編譯不同的代碼。

#ifdef _WIN32//windows 平臺專用代碼#include <windows.h>#elif __linux__//linux 平臺專用代碼#include <unistd.h>#else#error "Unsupported platfrom"#endif

3.調試模式與發布模式

????????通過宏定義控制調試信息的輸出。

#if _DEBUG
#define LOG(msg) std::cout << "[DEBUG] " << msg << std::endl#else
#define LOG(msg)#endif// 使用示例
int main()
{LOG("This is a debug message");// 調試模式下會輸出,否則不執行任何操作return 0;
}

??????? 在vs中測試結果如下:


4.功能開關

????????通過宏定義啟用或禁用某些功能。

// 在編譯時定義宏:USE_FEATURE_A#ifdef USE_FEATURE_A    //如果是用戶A,執行A功能void featureA() { /* 功能A的實現 */ }
#endif#ifdef USE_FEATURE_B    //如果是用戶B,執行B功能void featureB() { /* 功能B的實現 */ }
#endif

5.代碼兼容性處理

????????處理不同編譯器或語言標準的差異。

#if __cplusplus >= 201103L// C++11 及以上版本的代碼auto x = 42;
#else// 舊版本的替代代碼int x = 42;
#endif

結語

希望這篇關于 C語言條件編譯 的博客能對大家有所幫助,歡迎大佬們留言或私信與我交流.

學海漫浩浩,我亦苦作舟!關注我,大家一起學習,一起進步!


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

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

相關文章

如何在安卓平板上下載安裝Google Chrome【輕松安裝】

安卓平板可以通過系統內置的應用商店直接搜索并下載谷歌瀏覽器。用戶打開平板上的“Play 商店”&#xff0c;在搜索框輸入Google Chrome。出現結果后&#xff0c;點擊第一個帶有“Google LLC”字樣的應用圖標&#xff0c;然后點“安裝”按鈕。下載和安裝時間和網速有關&#xf…

.NET代碼保護混淆和軟件許可系統——Eziriz .NET Reactor 7

.NET代碼保護混淆和軟件許可系統——Eziriz .NET Reactor 7 1、簡介2、功能特點3、知識產權保護功能4、強大的許可系統5、軟件開發工具包6、部署方式7、下載 1、簡介 .NET Reactor是用于為.NET Framework編寫的軟件的功能強大的代碼保護和軟件許可系統&#xff0c;并且支持生成…

利用 SSE 實現文字吐字效果:技術與實踐

利用 SSE 實現文字吐字效果:技術與實踐 引言 在現代 Web 應用開發中,實時交互功能愈發重要。例如,在線聊天、實時數據監控、游戲中的實時更新等場景,都需要服務器能夠及時將數據推送給客戶端。傳統的請求 - 響應模式在處理實時性要求較高的場景時顯得力不從心,而 Server…

一個簡單易用的密碼生成器

基于瀏覽器的確定性密碼生成工具&#xff0c;通過用戶輸入的網站名稱和鹽值生成符合安全要求的密碼。特點&#xff1a; ? 相同輸入始終生成相同密碼 ? 密碼自動包含大小寫字母、數字和特殊符號 ? 以字母開頭&#xff0c;固定8位長度 ? 完全在客戶端運行&#xff0c;保護…

水上與水下遙控技術要點對比

1. 水上無人機遙控器技術要點 (1) 控制方式 多通道控制&#xff1a;通常使用2.4GHz或5.8GHz無線電信號&#xff0c;支持多通道&#xff08;如4通道以上&#xff09;分別控制飛行器的姿態&#xff08;俯仰、橫滾、偏航&#xff09;和油門。 高級飛行模式&#xff1a;如定高模…

Android_SDK鏈接 雷神模擬器(端口問題) --- app筆記

調試環境&#xff1a;JDK&#xff08;java&#xff09; SDK&#xff08;android&#xff09; Node.js 雷神模擬器&#xff08;或 真機&#xff09; Appium&#xff08;Appium Server【內外件&#xff08;dos內件、界面化工具&#xff09;】、Appium Inspector&#xff09; p…

FreeRTOS【3】任務調度算法

重要概念 在運行的任務&#xff0c;被稱為"正在使用處理器"&#xff0c;它處于運行狀態。在單處理系統中&#xff0c;任何時間里只能有一個任務處于運行狀態。 非運行狀態的任務&#xff0c;它處于這 3 中狀態之一&#xff1a;阻塞(Blocked)、暫停(Suspended)、就緒…

SLAM常用地圖對比示例

序號地圖類型概述1格柵地圖將現實環境柵格化&#xff0c;每一個柵格用 0 和 1 分別表示空閑和占據狀態&#xff0c;初始化為未知狀態 0.52特征地圖以點、線、面等幾何特征來描繪周圍環境&#xff0c;將采集的信息進行篩選和提取得到關鍵幾何特征3拓撲地圖將重要部分抽象為地圖&…

【Vue】TypeScript與Vue3集成

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Vue 文章目錄 1. 前言2. 環境準備與基礎搭建2.1. 安裝 Node.js 與 npm/yarn/pnpm2.2. 創建 Vue3 TypeScript 項目2.2.1. 使用 Vue CLI2.2.2. 使用 Vite&#xff08;推薦&#xff09;2.2.3. 目錄結構簡述 3. Vue3 TS 基礎語法整…

高防IP是什么

"高防IP"是指"高防護IP"&#xff0c;是一種防御DDoS&#xff08;分布式拒絕服務攻擊&#xff09;的網絡安全服務。在分布式拒絕服務攻擊中&#xff0c;攻擊者會利用許多不同的計算機或者其他設備&#xff0c;通過向目標發送大量的網絡請求來嘗試使目標服務…

手機訪問電腦端Nginx服務器配置方式

修改當前站點Nginx的配置如下。其中端口號必須是一個比較獨特的端口號&#xff0c;比如8001。這樣可以跟別的項目區分開來。域名使用0.0.0.0。 server {listen 80;listen 8001;server_name zfmap.cc 0.0.0.0;假設你電腦端的ip地址是192.168.1.101,那么你的手機與你的電腦連在同…

【算法】計數排序、桶排序、基數排序

算法系列八&#xff1a;非比較排序 一、計數排序 1.實現 1.1步驟 1.2代碼 2.性質 2.1穩定性 2.1.1從前往后前始版&#xff1a; 2.1.2從后往前末始版&#xff1a; 2.2復雜度 2.2.1時間復雜度 2.2.2空間復雜度 二、桶排序 1.實現 1.1步驟 1.2代碼 2.穩定性 三、…

JDK版本與Spring Boot版本之間對應關系

JDK&#xff08;Java Development Kit&#xff09;版本與Spring Boot版本之間存在一定的對應關系&#xff0c;選擇合適的搭配對項目的穩定性、性能及功能實現至關重要&#xff0c;以下是詳細介紹&#xff1a; 主要版本對應關系 Spring Boot版本發布日期支持的JDK版本備注3.2.…

如何檢測Python項目哪些依賴庫沒有使用

要檢測Python項目中哪些依賴庫未被使用&#xff0c;可以采用以下方法&#xff1a; 1. 使用靜態分析工具 vulture&#xff1a;靜態分析工具&#xff0c;檢測未使用的代碼和導入 pip install vulture vulture your_project/pyflakes&#xff1a;檢查未使用的導入語句 pip ins…

【智能指針】—— 我與C++的不解之緣(三十三)

一、智能指針的使用 還記得&#xff0c;在異常學習的時候&#xff0c;我們分析出了一個問題 double Divide(int x, int y) {if (y 0){throw string("the y is zero");}return (double)x / double(y); } void test(int x, int y) {int* arr new int[10];Divide(x,…

Hadoop+Spark 筆記 2025/4/21

讀書筆記 定義 1. 大數據&#xff08;Big Data&#xff09; - 指傳統數據處理工具難以處理的海量、高速、多樣的數據集合&#xff0c;通常具備3V特性&#xff08;Volume體量大、Velocity速度快、Variety多樣性&#xff09;。擴展后還包括Veracity&#xff08;真實性&#x…

femap許可不足如何解決

在復雜的工程仿真領域&#xff0c;Femap以其強大的功能和廣泛的應用場景而備受青睞。然而&#xff0c;隨著用戶需求的增長和項目規模的擴大&#xff0c;Femap許可不足的問題逐漸凸顯&#xff0c;成為了許多工程師和團隊面臨的挑戰。本文將為您詳細解析Femap許可不足的原因&…

【Microsoft Store 中的軟件推薦】

目錄&#xff1a; &#x1f600; TranslucentTB&#x1f600; Snipaste&#x1f600; Watt Toolkit&#x1f600; NVIDIA Control Panel&#x1f600; Typedown 微軟應用商店中的軟件會直接安裝在C盤&#xff0c;所以&#xff0c;下面分享的這些是即超級好用&#xff0c;又占用…

AOSP Android14 Launcher3——RecentsView最近任務數據加載

最近任務是Launcher中的一個重要的功能&#xff0c;顯示用戶最近使用的應用&#xff0c;并可以快速切換到其中的應用&#xff1b;用戶可以通過底部上滑停頓進入最近任務&#xff0c;也可以在第三方應用底部上滑進最近任務。 這兩種場景之前的博客也介紹過&#xff0c;本文就不…

Flink介紹——實時計算核心論文之Flink論文

引入 通過前面的文章&#xff0c;我們梳理了大數據流計算的核心發展脈絡&#xff1a; S4論文詳解S4論文總結Storm論文詳解Storm論文總結Kafka論文詳解Kafka論文總結MillWheel論文詳解MillWheel論文總結Dataflow論文詳解Dataflow論文總結 而我們專欄的主角Flink正是站在前人的…