預處理機制

跟著肯哥(不是我)學預處理機制

預處理類別

宏定義:#define

  • 將文本替換為表達式或語句

條件編譯:#ifdef#ifndef#if#elif#endif

  • 根據標識符是否被定義選擇編譯代碼

頭文件包含:#include

  • 將其他文件(通常是頭文件)包含到當前文件中,以便在當前文件中使用頭文件中定義的內容

預處理流程

  1. 預處理指令識別
  2. 宏替換
  3. 條件編譯
  4. 頭文件包含
  5. 行連接處理
  6. 宏展開和條件編譯的遞歸處理

預處理指令識別

掃描源代碼并識別以#開頭的預處理指令。

宏替換

預處理器根據宏定義將代碼中的宏名稱替換為指定的文本。
可以是常量替換,也可以是帶參數的宏函數替換
預處理器會根據宏定義展開宏

條件編譯

根據條件選擇性地編譯不同的代碼塊。
#ifdef#ifndef#if#elif#endif

頭文件包含

通過#include指令,將其他文件(通常是頭文件)包含到當前文件中,以便在當前文件中使用頭文件中定義的內容

預處理的行連接處理

在C語言中,行連接處理是預處理階段的一部分,用于將一行代碼書寫為多行,以保持代碼可讀性。
行連接操作通過反斜杠\字符實現。一行代碼以反斜杠字符結尾時,該行代碼將與下一行自動連接為一行。
image.png
換行之后的進位也會被當作空格輸出出來。
行連接在預處理階段,在編譯階段看到代碼時,已經是連接在一起的一行。這種處理不會影響編譯器的語義分析和中間代碼。

宏展開和條件編譯的遞歸處理

在進行宏展開和條件編譯時,如果遇到新的預處理指令,預處理器會遞歸地處理這些指令。肯呢個會觸發更多的宏展開和條件編譯。

刪除注釋

預處理器將源代碼中的注釋刪除,注釋在預處理階段無需保留,不會影響編譯器的輸出。

預編譯的警告信息和錯誤信息

可以使用#error#warning預處理指令來生成編譯錯誤和警告信息。這些指令在預處理時發出特定的錯誤或警告信息,讓開發者知道代碼中存在的問題或需要注意的地方
image.png
#error#warning指令生成的信息只會在預處理階段發出,而不會影響到最終的目標代碼,它們在編譯階段不會生成任何錯誤或警告信息。
image.png

查看預處理后的源文件

以肯哥用的GCC為例。
可以使用-E選項來查看預處理后的源文件。只進行預處理操作,不進行編譯、匯編和鏈接。將預處理后的源文件輸出到標準輸出流,一般是控制臺。
gcc -E example.c
編譯器會將預處理后的內容輸出到控制臺。
如果你想將預處理后的源文件保存到一個文件中,可以使用重定向操作符>將輸出重定向到一個文件中。
gcc -E example.c > preprocessed.c
上述命令會將預處理后的源文件保存到名為preprocessed.c的文件中。

重點強調

  • 宏定義的命名規范
  • 宏定義與函數調用的沖突
  • #include不單單是只能包含頭文件:include的本質就是純文本包含。
  • 善用條件編譯:在龐大工程代碼的配置裁剪工作中,絕大多數的技術手段就是利用條件編譯,對不同的代碼選用和刪除,達到代碼裁剪的效果。

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

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

相關文章

Jmeter怎么實現接口關聯?

用于接口測試時,后一個接口經常需要用到前一次接口返回的結果,應該如何獲取前一次請求的結果值,應用于后一個接口呢,拿一個登錄的例子來說明如何獲取。 1、打開jmeter,新建一個測試計劃,在測試計劃里新建一…

將所有圖片居中對齊

Ctrl h 調出替換框 ^g表示所有圖片 格式里面選擇段落 全部替換

winlogbeat采集windows日志

下載鏈接 https://www.elastic.co/cn/downloads/past-releases/winlogbeat-7-16-2 配置文件 # ---------------------------- Elasticsearch Output ---------------------------- output.elasticsearch:# Array of hosts to connect to.hosts: ["192.168.227.160:9200&…

Vue3中如何響應式解構 props

目錄 1,前言2,解決2.1,利用插件,實現編譯時轉換2.2,toRef 和 toRefs 1,前言 Vue3 中為了保持響應性,始終需要以 props.x 的方式訪問這些 prop。這意味著不能夠解構 defineProps 的返回值&#…

Navicat 技術指引 | 適用于 GaussDB 的數據遷移工具

Navicat Premium(16.2.8 Windows版或以上) 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能,還提供強大的高階功能(如模型、結構同步、協同合作、數據遷移等),這…

Cesium 展示——地球以及渲染數據導出(下載)為圖片或 pdf

文章目錄 需求分析新加需求分析第一種方式第二種方式需求 將 Cesium 球體以及渲染數據導出為 jpg/png/pdf 分析 獲取場景 scene 信息,轉為image 的 octet-stream 流 進行下載為圖片 /*** @todo canvas 導出圖片* @param {string} dataurl - 地址* @return {Blob}*/ functio…

Failed to resolve import “@/..“ from “src/...“ @找不到路徑

安裝path npm install --save-dev types/node再修改 vite.config.ts 中的配置即可 import { defineConfig } from "vite" import react from "vitejs/plugin-react"import path from "path" // 需安裝此模塊// https://vitejs.dev/config/ expo…

設備健康管理平臺助力鋰電企業實現可持續發展

隨著鋰電池產業的快速發展,設備的穩定運行和精準維護對于鋰電企業來說至關重要。傳統的設備維護方式在效率和全面性方面存在局限,無法滿足鋰電行業對設備管理的需求。然而,通過設備健康管理平臺的引入,鋰電企業現在可以充分發揮其…

XSLVGL2.0 User Manual 頁面管理器(v2.0)

XSLVGL2.0 開發手冊 XSLVGL2.0 User Manual 頁面管理器 1、概述2、特性3、APIs3.1、xs_page_init3.2、xs_page_wait_inited3.3、xs_page_exit3.4、xs_page_acquire3.5、xs_page_release3.6、xs_page_set_bootlogo3.7、xs_page_setup_clear_finish3.8、xs_page_setup_is_finish…

【LeetCode:1410. HTML 實體解析器 | 模擬+哈希表+字符串+庫函數】

🚀 算法題 🚀 🌲 算法刷題專欄 | 面試必備算法 | 面試高頻算法 🍀 🌲 越難的東西,越要努力堅持,因為它具有很高的價值,算法就是這樣? 🌲 作者簡介:碩風和煒,…

【C語言】中,輸入一個數組,實現將輸入的n個數字按照從大到小的順序輸出。【通俗簡單易懂】

本篇文章中,我們將講述在C語言中,輸入一個數組,如何用for循環實現將輸入的n個數字按照從大到小輸出。 一.定義數組并初始化 首先,我們定義一個整形的數組并將其初始化。輸入n,來決定數組中整數的個數。 然后用for循…

通過HTML網頁對mysql數據庫進行增刪改查(CRUD實例)

首先我們得了解一下大致的架構 ,如下: 我們采用自底向上的方式進行開發, 一、先寫mysql數據庫 二、再寫java后端(Spring MVC架構)(這個是什么東西不懂不要緊,跟著步驟做就行了) 三、最后寫前端頁面(HTML) 一、 Mysql數據庫部分 我們要通過網頁對數據庫進行開發,…

解決:Gitee + PicGo配置圖床失敗

解決:Gitee PicGo配置圖床失敗 PicGo安裝插件的時候選擇:gitee-uploader,不要選擇gitee! 在Gitee新建的圖床倉庫中設置一個images文件夾,用來保存上傳的圖片,但是要注意在PicGo中的path中要寫上路徑/img…

數據庫基礎入門 — SQL運算符

我是南城余!阿里云開發者平臺專家博士證書獲得者! 歡迎關注我的博客!一同成長! 一名從事運維開發的worker,記錄分享學習。 專注于AI,運維開發,windows Linux 系統領域的分享! 本…

linux的基礎命令

文章目錄 linux的基礎命令一、linux的目錄結構(一)Linux路徑的描述方式 二、Linux命令入門(一)Linux命令基礎格式 三、ls命令(一)HOME目錄和工作目錄(二)ls命令的參數1.ls命令的-a選…

基于yolov2深度學習網絡的喝水行為檢測系統matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1、YOLOv2網絡原理 4.2、基于YOLOv2的喝水行為檢測 5.算法完整程序工程 1.算法運行效果圖預覽 2.算法運行軟件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off;…

PPT思維導圖怎么做?這2個思維導圖工具墻裂推薦!

在日常學習和工作中,我們常常會面臨需要處理大量信息的情況,這時候,一種叫做思維導圖的工具可能會成為你的救星。 不同于傳統的線性記錄方式,思維導圖以其獨特的視覺表現力和結構化的信息處理方式,使得人們能夠更加有…

Flutter學習(四)如何取消listview的越界效果

背景 在flutter的開發過程中,ListView是很常見的一個組件,但是,由于ListView的某些自帶的體驗,導致不太好的用戶體驗。例如ListView中,滑動到頂部或者底部的時候,再次滑動,會有越界的效果&…

同步和異步

同步和異步是處理任務時的兩種不同方式。 同步是指一個進程在執行某個請求的時候,如果該請求需要一段時間才能返回信息,那么這個進程會一直等待下去,直到收到返回信息才繼續執行下去。這種方式下,任務是按照順序一個一個執行的&am…

2023年亞太地區數學建模大賽 問題A

采果機器人的圖像識別技術 中國是世界上最大的蘋果生產國,年產量約為3500萬噸。與此同時,中國也是世界上最大的蘋果出口國,全球每兩個蘋果中就有一個,全球超過六分之一的蘋果出口自中國。中國提出了一帶一路倡議(BRI&…