入門-C編程基礎部分:16、 預處理器

飛書文檔https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf

C 預處理是編譯過程中一個單獨的步驟,是一個文本替換工具而已。所有的預處理命令都是以井號(#)開頭。

指令描述
#define定義宏
#ifdef如果宏已經定義,則返回真
#ifndef如果宏沒有定義,則返回真
#endif結束一個 #if……#else 條件編譯塊

#define

#define MAX_ARRAY_LENGTH 20

這個指令告訴編譯器把所有的 MAX_ARRAY_LENGTH 定義為 20。使用 #define 定義常量來增強可讀性。

#include <stdio.h>
#define MESSAGE "You wish!"
#define MAX_ARRAY_LENGTH 20
int main(void)
{printf("Here is the message: %s\n", MESSAGE);printf("max array length : %d\n", MAX_ARRAY_LENGTH );??return 0;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Here is the message: You wish!
max array length : 20

#define更多用法

宏定義函數

C語言一個強大的功能是可以使用參數化的宏來模擬函數。例如,

int square(int x) {return x * x;
}
我們可以使用宏重寫上面的代碼,如下:
#define square(x) ((x) * (x))

在使用帶有參數的宏之前,必須使用 #define 指令定義。參數列表是括在圓括號內,且必須緊跟在宏名稱的后邊。宏名稱和左圓括號之間不允許有空格。例如:

#include <stdio.h>#define square(x) ((x) * (x))int main(void)
{printf("10*10=%d\n", square(10));?return 0;
}

宏延續運算符(\

一個宏通常寫在一個單行上。但是如果宏太長,一個單行容納不下,則使用宏延續運算符(\)。例如:

#define square(x) \((x) * (x))

標記粘貼運算符(##

宏定義內的標記粘貼運算符(##)會合并兩個參數。它允許在宏定義中兩個獨立的標記被合并為一個標記。例如:

#include <stdio.h>#define tokenpaster(n) printf ("token = %d", token##n)int main(void)
{int token34 = 40;tokenpaster(34);return 0;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

token = 40

#ifndef

#ifndef TEST#define MESSAGE "You wish!"
#endif

這個指令告訴編譯器只有當 MESSAGE 未定義時,才定義 MESSAGE,常用于頭文件,防止重復引用

C
test.h
int a = 10;
app1.c
#include "test.h"
app2.c
#include "test.h"

編譯時會報multiple definition of `a'錯誤,這時候可以添加

#ifndef TEST
??
int a = 10;
#endif

#ifdef

#ifdef DEBUG
??
/* Your debugging statements here */
#endif

這個指令告訴 CPP 如果定義了 DEBUG,則執行處理語句,常用于編譯選擇,例如下發工程,如果我們只希望在調試時打印信息,正式發布不打印信息。

#include <stdio.h>#define DEBUG
#ifdef DEBUG#define MESSAGE "You wish!"
#endifint main(void)
{#ifdef DEBUGprintf("Here is the message: %s\n", MESSAGE);#endifreturn 0;
}

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

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

相關文章

Ubuntu下安裝和卸載MySQL

Ubuntu下安裝和卸載MySQL 下面的演示系統版本&#xff1a;Ubuntu 24.04 更新系統軟件包 在開始安裝之前&#xff0c;建議先更新系統的軟件包列表&#xff0c;以確保所有依賴項是最新的。 sudo apt update && sudo apt upgrade -y安裝MySQL服務器 Ubuntu的官方軟件…

【Python爬蟲實戰篇】--爬取豆瓣電影信息(靜態網頁)

網站&#xff0c;&#xff1a;豆瓣電影 Top 250 爬取豆瓣前250電影的信息&#xff0c; F12打開網頁控制臺&#xff0c;查看網頁元素&#xff0c; 發現網頁數據直接可以查看到&#xff0c;為靜態網頁數據&#xff0c;較為簡單 目錄 1.第一步使用urllib庫獲取網頁 2.第二步使…

【Unity知識點詳解】Unity中泛型單例的使用,兼容WebGL

今天來講下Unity中泛型單例的使用&#xff0c;包含普通單例和繼承MonoBehaviour的單例。重點是需要兩種泛型單例兼容WebGL平臺&#xff0c;話不多說直接開始。 泛型單例的設計目標 作為泛型單例&#xff0c;需要實現以下幾個目標&#xff1a; 全局唯一&#xff0c;在程序的整個…

Python進程與線程的深度對比

一、核心概念對比 1. 進程&#xff08;Process&#xff09; 操作系統級獨立單元&#xff1a;每個進程擁有獨立的內存空間&#xff08;堆、棧、代碼段&#xff09; 資源隔離性&#xff1a;崩潰不影響其他進程 多核并行&#xff1a;可充分利用多核CPU資源 2. 線程&#xff0…

Django 入門指南:構建強大的 Web 應用程序

什么是 Django&#xff1f; Django 是一個開源的高層次 Python Web 框架&#xff0c;旨在快速開發安全且可維護的網站。它通過簡化常見的 Web 開發任務&#xff0c;幫助開發者專注于開發應用的核心功能。Django 實現了“快速開發”和“盡量少的重復”的理念&#xff0c;提供了…

ESP-ADF外設子系統深度解析:esp_peripherals組件架構與核心設計(顯示輸出類外設之IS31FL3216)

目錄 ESP-ADF外設子系統深度解析&#xff1a;esp_peripherals組件架構與核心設計&#xff08;顯示輸出類外設之IS31FL3216&#xff09;簡介模塊概述功能定義架構位置核心特性 IS31FL3216外設分析IS31FL3216外設概述IS31FL3216外設層次架構圖 IS31FL3216外設API和數據結構外設層…

【計算機網絡 | 第三篇】常見的網絡協議(二)

沒有看過我寫的關于網絡協議的第一篇博客可以看【計算機網絡 | 第二篇】常見的通信協議&#xff08;一&#xff09;-CSDN博客 TCP的三次握手和四次揮手 TCP三次握手 三次握手是TCP協議建立可靠連接的過程&#xff0c;目的是確保客戶端和服務端雙方的雙向通信能力正常&#x…

HAL庫(STM32CubeMX)——高級ADC學習、HRTIM(STM32G474RBT6)

系列文章目錄 文章目錄 系列文章目錄前言存在的問題HRTIMcubemx配置前言 對cubemx的ADC的設置進行補充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 獨立 ADC 模式,當使用一個 ADC 時是獨立模式,使用兩個 ADC 時是雙模式,在雙模式下還有很多細分模式可選 ADC_Se…

Unity接入安卓SDK(3)厘清Gradle的版本

接入過程中&#xff0c;很多人遇到gradle的各種錯誤&#xff0c;由于對各種gradle版本的概念不甚了了&#xff0c;模模糊糊一頓操作猛如虎&#xff0c;糊弄的能編譯通過就萬事大吉&#xff0c;下次再遇到又是一臉懵逼。所以我們還是一起先厘清gradle的版本概念。 1 明晰概念 …

python-67-基于plotly的繪圖可視化和智能推薦圖表

文章目錄 1 各種圖表的適用場景1.1 面積圖1.2 餅圖1.3 散點圖1.3.1 散點1.3.2 散點加線1.4 折線圖1.5 箱線圖1.5.1 不同類別的箱線圖1.5.2 一個變量的箱線圖1.5.3 多個變量的箱線圖1.6 小提琴圖1.6.1 不同類別的小提琴圖1.6.2 一個變量的小提琴圖1.7 直方圖1.7.1 直方圖1.7.2 分…

Spring AI MCP

MCP是什么 MCP是模型上下文協議&#xff08;Model Context Protocol&#xff09;的簡稱&#xff0c;是一個開源協議&#xff0c;由Anthropic&#xff08;Claude開發公司&#xff09;開發&#xff0c;旨在讓大型語言模型&#xff08;LLM&#xff09;能夠以標準化的方式連接到外…

c++_csp-j算法 (3)

弗洛伊德算法&#xff08;Floyd&#xff09; Floyd算法又稱為插點法&#xff0c;是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法&#xff0c;與Dijkstra算法類似。該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特弗洛伊…

QT常見輸入類控件及其屬性

Line Edit QLineEdit用來表示單行輸入框&#xff0c;可以輸入一段文本&#xff0c;但是不能換行 核心屬性&#xff1a; 核心信號 信號 說明 void cursorPositionChanged(int old,int new) 當鼠標移動時發出此型號&#xff0c;old為先前位置&#xff0c;new為新位置 void …

【k8s系列1】一主兩從結構的環境準備

環境準備 虛擬機軟件準備及安裝&#xff0c;這里就不詳細展開了&#xff0c;可以看文章:【一、虛擬機vmware安裝】 linux環境準備及下載&#xff0c;下載鏡像centOS7.9&#xff0c;以前也有寫過這個步驟的文章&#xff0c;可以看&#xff1a;【二、安裝centOS】 開始進入正題…

【C++類和數據抽象】類的作用域

目錄 一、類的作用域基本概念 1.1 什么是類的作用域 1.2 作用域層次體系 1.3 類作用域的特點 1.4 基本訪問規則 二、訪問控制三劍客 2.1 public&#xff1a;開放接口 2.2 private&#xff1a;數據封裝 2.3 protected&#xff1a;繼承通道 2.4 跨作用域訪問示例 三…

opencv圖片顏色識別,顏色的替換

圖片顏色識別 1. RGB顏色空間2. 顏色加法2.1使用numpy對圖像進行加法2.2使用opencv加法&#xff08;cv2.add&#xff09; 3 顏色加權加法&#xff08;cv2.addWeighted()&#xff09;4. HSV顏色空間5. 制作掩膜4. 與運算&#xff08;cv2.bitwise_and&#xff09;5.顏色的替換7 R…

ADC數據不穩定的解決方案

問題如圖&#xff1a; 解決方案&#xff1a;上圖第一個通道后來接入GND&#xff0c;就穩定了 上圖第一個通道后來接入VCC&#xff0c;就穩定了

Spark(18)Yarn-概述

Hadoop三大核心組件&#xff1a;HDFS、MapReduce和YARN 一&#xff09;Yarn的概念 YARN(Yet Another Resource Negotiator,另一種資源協調者)是一個通用資源管理系統和調度平臺&#xff0c;可為上層應用提供統一的資源管理和調度。它的引入為集群在利用率&#xff0c;資源統一管…

Flowith AI,解鎖下一代「知識交易市場」

前言 最近幾周自媒體號都在瘋狂推Manus&#xff0c;看了幾篇測評后&#xff0c;突然在某個時間節點&#xff0c;在特工的文章下&#xff0c;發現了很小眾的Flowith。 被這段評論給心動到&#xff0c;于是先去注冊了下賬號。一翻探索過后&#xff0c;發現比我想象中要有趣的多&…

Maxscript調用Newtonsoft.Json解析Json

Maxscript調用Newtonsoft.Json解析Json_newtonsoft.json maxscript-CSDN博客