C語言深度剖析書籍學習記錄 第三章 預處理

?宏

  • _LINE_ 表示正在編譯的文件的行號
  • _FILE_ 表示正在編譯的文件的名字
  • _DATE_ 表示編譯時刻的日期字符串,例如: "25 Dec 2007"
  • _TIME_ 表示編譯時刻的時間字符串,例如: "12:30:55"
  • _STDC_ 判斷該文件是不是定義成標準 C 程序
  • 宏名的書寫由標識符與兩邊各二條下劃線構成
  • #define PI 3.141592654
  • const 修飾的不是常量而是 readonly 的變量,const 修飾的只讀變量不能用來作為定義數組的維數, 也不能放在 case 關鍵字后面。
  • #define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3? 路徑使用雙 反斜杠? ?單\ 表示連接符

?

  • 宏的生命周期從#define 開始到#undef 結束?

條件編譯

  • 條件編譯的功能使得我們可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。這對于程序的移植和調試是很有用的。
  • 條件編譯有三種形式

?

?文件包含

  • 文件包含是將多個源文件鏈接形成一個源文件進行編譯,形成一個目標文件
  • #include<>?預處理到 系統規定的路徑中去獲得這個文件(即 C 編譯系統所提供的并存放在指定的子目錄下的頭 文件)。找到文件后,用文件內容替換該語句
  • filename 為要包含的文件名稱。雙引號表示預處理應在當前目錄中查找文件名為 filename 的文件,若沒有找到,則按系統指定的路徑信息,搜索其他目錄。找到文件后,用 文件內容替換該語句。
  • 需要強調的一點是:#include 是將已存在文件的內容嵌入到當前文件中。 另外關于#include 的路徑也有點要說明:include 支持相對路徑,格式如 trackant(蟻跡尋
    蹤)所寫: .代表當前目錄,..代表上層目錄。

#error預處理

  • #error 預處理指令的作用是,編譯程序時,只要遇到 #error 就會生成一個編譯錯誤提 示消息,并停止編譯。
  • 其語法格式為:??#error error-message
  • 注意,宏串 error-message 不用雙引號包圍。遇到#error 指令時,錯誤信息被顯示,可能同時 還顯示編譯程序作者預先定義的其他內容。關于系統所支持的 error-message 信息,請查找 相關資料

#line處理

  • #line 的作用是改變當前行數和文件名稱,它們是在編譯程序中預先定義的標識符 命令的基本形式如下:
  • #line number["filename"]? ?其中[]內的文件名可以省略?#line 30 a.h? 其中,文件名 a.h 可以省略不寫。
  • 這條指令可以改變當前的行號和文件名,例如上面的這條預處理指令就可以改變當前的行號 為 30,文件名是 a.h。初看起來似乎沒有什么用,不過,他還是有點用的,那就是用在編譯 器的編寫中,我們知道編譯器對 C 源碼編譯過程中會產生一些中間文件,通過這條指令, 可以保證文件名是固定的,不會被這些中間文件代替,有利于進行分析。

#pragma

  • #pragma 指令可能是最復雜的了,它的作用是設定編譯器的 狀態或者是指示編譯器完成一些特定的動作。#pragma 指令對每個編譯器給出了一個方法, 在保持與 C 和 C ++語言完全兼容的情況下,給出主機或操作系統專有的特征。依據定義,編譯 指示是機器或操作系統專有的,且對于每個編譯器都是不同的。
  • 其格式一般為: #pragma para? ? ?其中 para 為參數,下面來看一些常用的參數。?

#pragma message

  • message 參數:Message 參數是我最喜歡的一個參數,它能夠在編譯信息輸出窗口中輸出相應的信息,這對于源代碼信息的控制是非常重要的。
  • 其使用方法為:? #pragma message(“消息文本”)
  • 當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。 當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有 正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判 斷自己有沒有在源代碼的什么地方定義了_X86 這個宏可以用下面的方法?

?

?

?

內存對齊

  • ?利用#pragma pack()來改變編譯器的默認對齊方式
  • 使用指令#pragma pack (n),編譯器將按照 n 個字節對齊。
  • 使用指令#pragma pack (),編譯器將取消自定義字節對齊方式。 在#pragma pack (n)和#pragma pack ()之間的代碼按 n 個字節對齊。
  • 但是,成員對齊有一個重要的條件,即每個成員按自己的方式對齊.也就是說雖然指定了 按 n 字節對齊,但并不是所有的成員都是以 n 字節對齊。其對齊的規則是,每個成員按其類型 的對齊參數(通常是這個類型的大小)和指定對齊參數(這里是 n 字節)中較小的一個對齊,即: min( n, sizeof( item )) 。并且結構的長度必須為所用過的所有對齊參數的整數倍,不夠就補空 字節。
  • 注意事項?

#?

  • ?在字符串中包含宏參數,那我們就可以使用“#”,它可以把語言符號轉 化為字符串

##運算符

  • 和#運算符一樣,##運算符可以用于宏函數的替換部分。這個運算符把兩個語言符號組合成單個語言符號?

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

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

相關文章

js正則限制字符串長度_正則筆記(3)萬字長文,慎點。

正則講了很久&#xff0c;也拖了很久&#xff0c;今天看看怎么用吧&#xff0c;后續更文應該會比較準勤快了。:-)書接上文【正則筆記(2)】。這次我們來看看正則的使用&#xff1a;(注&#xff1a;斜體表示為對應規則寫出的正則表達式)一、 常用的正則表達式&#xff1a;1. 驗證…

C語言深度剖析書籍學習記錄 第四章 指針和數組

p 稱為指針變量,p 里存儲的內存地址處的內存稱為 p 所指向的內存。 指針變量 p 里存儲的任何數據都將被當作地址來處理一個基本的數據類型(包括結構體等自定義類型)加上“*” 號就構成了一個指針類型的模子。這個模子的大小是一定的&#xff0c;與“*”號前面的數據類型無 關。…

js中select下拉框重置_如何利用CSS3制作炫酷的下拉框

很多小伙伴都不清楚CSS3是做什么&#xff1f;用途是什么&#xff1f;接下來我就給展示一個css3制作一個炫酷下拉框。其實不只是這些&#xff0c;還有很多。CSS3是CSS(層疊樣式表)技術的升級版本&#xff0c;于1999年開始制訂&#xff0c;2001年5月23日W3C完成了CSS3的工作草案&…

select選擇框必輸校驗_輪子這么多,我們為什么選擇自研NewSQL

作者介紹李鑫&#xff0c;滴滴資深軟件開發工程師&#xff0c;多年分布式存儲領域設計及開發經驗。曾參與NoSQL/NewSQL數據庫Fusion、分布式時序數據庫sentry、NewSQL數據庫SDB等系統的設計開發工作。一、背景Fusion-NewSQL是由滴滴自研的在分布式KV存儲基礎上構建的NewSQL存儲…

C語言深度剖析書籍學習記錄 第五章 內存管理

常見的內存錯誤 定義了指針變量&#xff0c;但是沒有為指針分配內存&#xff0c;即指針沒有指向一塊合法的內存。 結構體成員指針未初始化 很多初學者犯了這個錯誤還不知道是怎么回事。這里定義了結構體變量 stu&#xff0c;但是他沒 想到這個結構體內部 char *name 這成員在定…

怎么改電腦網絡ip地址_拋棄重啟路由器獲取ip地址方式,巧妙運用ip代理改IP工具...

網絡是簡單的也是復雜的&#xff0c;在如此龐大的網絡世界里有太多的不確定因素&#xff0c;導致我們遇到IP限制問題&#xff0c;從而影響到我們的網絡訪問&#xff0c;而大家都知道&#xff0c;如果遇到ip被限制的問題&#xff0c;最快速直接的辦法就是把被限制的ip更換一個新…

C語言深度剖析書籍學習記錄 第六章 函數

函數的好處 1、降低復雜性:使用函數的最首要原因是為了降低程序的復雜性&#xff0c;可以使用函數來隱含信息&#xff0c;從而使你不必再考慮這些信息。2、避免重復代碼段:如果在兩個不同函數中的代碼很相似&#xff0c;這往往意味著分解工作有誤。這時&#xff0c;應該把兩個…

如何把word分裝到兩個byte_如何核對兩個Word文檔的內容差別?同事加班半小時,我只花了30秒...

昨天下班前&#xff0c;老板突然發了兩份Word文檔過來&#xff0c;一份是原稿&#xff0c;還有一份是修訂稿&#xff0c;叫我們找出兩份文檔的內容差別之處&#xff0c;我只花了30秒就搞定了&#xff0c;然后準時下班&#xff01;你想知道我是怎么操作的嗎&#xff1f;下面小源…

stm32f767中文手冊_ALIENTEK 阿波羅 STM32F767 開發板資料連載第五章 SYSTEM 文件夾

1)實驗平臺&#xff1a;alientek 阿波羅 STM32F767 開發板2)摘自《STM32F7 開發指南(HAL 庫版)》關注官方微信號公眾號&#xff0c;獲取更多資料&#xff1a;正點原子第五章 SYSTEM 文件夾介紹第三章&#xff0c;我們介紹了如何在 MDK5 下建立 STM32F7 工程。在這個新建的工程之…

手機安卓學習 內核開發

官網開源代碼 Documentation - MiCode/Xiaomi_Kernel_OpenSource - Sourcegraph Xiaomi 11T Pro GitHub - MiCode/Xiaomi_Kernel_OpenSource: Xiaomi Mobile Phone Kernel OpenSourceAndroid 開源項目 | Android Open Source Project google安卓官網 目錄概覽 參考…

vs 啟動調用的目標發生異常_如何解決不可測、異常場景的問題?

阿里QA導讀&#xff1a;在軟件研發過程中&#xff0c;發布前跨多個系統的聯調測試是不可或缺的一環&#xff0c;而在聯調過程中&#xff0c;經常會遇到一些比較棘手的困難&#xff0c;阻塞整個聯調進程。其中比較典型的有&#xff1a;第三方的研發節奏不一致&#xff0c;導致無…

Linux內核 scatterlist介紹

scatterlist 物理內存的散列表。通俗講&#xff0c;就是把一些分散的物理內存&#xff0c;以列表的形式組織起來 誕生背景 假設有三個模塊可以訪問memory&#xff1a;CPU、DMA控制器和某個外設。CPU通過MMU以虛擬地址&#xff08;VA&#xff09;的形式訪問memory&#xff1b;…

www.python123.org_python爬蟲-requests

Requests庫是目前常用且效率較高的爬取網頁的庫1.一個簡單的例子import requests #引入requests庫r requests.get("http://www.baidu.com")  #調用get方法獲取界面print(r.status_code)    #輸出狀態碼print(r.text)    #輸出頁面信息通過以下代碼&#x…

Linux內核 crypto文件夾 密碼學知識學習

密碼算法分類 對稱算法非對稱算法消息摘要&#xff08;單向哈希&#xff09;算法這些算法作為加密函數框架的最底層&#xff0c;提供加密和解密的實際操作。這些函數可以在內核crypto文件夾下&#xff0c;相應的文件中找到。不過內核模塊不能直接調用這些函數&#xff0c;因為…

python隨機出100道加法題_自動出題隨機100題-20以內加減法全部算式

班 級:姓 名:12-819-411-1114-1018-111417-261215-113-417-819-1914-341516-31269619-161159312817-014-1414-1112-501414-017-616-111-012-211520-711113051019-1810619-691118-1220-519-818018114-1416-712-1015-1319-916-714-920-717-118-1611-815-416-1014-919-416-1413-…

Linux crypto相關知識的匯總 Linux加密框架crypto中的算法和算法模式(一)

Linux加密框架中的算法和算法模式 Linux加密框架中的算法和算法模式&#xff08;一&#xff09;_家有一希的博客-CSDN博客 加密框架支持的密碼算法主要是對稱密碼算法和哈希算法&#xff0c;暫時不支持非對稱密碼算法。除密碼算法外&#xff0c;加密框架還包括偽隨機數生成算法…

python3.5.2安裝pygame_【閑來無事,py寫game】Mac-Python3.5安裝pygame 1.9.2 小計

13正文之前沒錯&#xff0c;我就是這么不學無術&#xff0c;C實在學的雞兒疼&#xff0c;所以干脆搞點娛樂措施&#xff0c;昨天趕上了京東圖書做大活動&#xff0c;所以屯了一批書&#xff0c;好久沒碰python了。所以就整本玩玩&#xff01;今天這不就上手了么&#xff01;自己…

Linux crypto相關知識的匯總 Linux加密框架crypto對稱算法和哈希算法加密模式

參考鏈接 Linux加密框架中的算法和算法模式&#xff08;二&#xff09;_家有一希的博客-CSDN博客 對稱算法 分組算法模式 ECB模式 ECB模式下&#xff0c;明文數據被分為大小合適的分組&#xff0c;然后對每個分組獨立進行加密或解密如下圖所示如果兩個明文塊相同&#xff0c…

物化視圖和視圖的最大區別_基于catalyst的物化視圖改寫引擎的實現

更新日志&#xff1a;1. 2020/06/16 group by 視圖的部分描述錯誤&#xff0c;已修正。什么是物化視圖我先用我的話解釋一下什么是物化視圖。假設我們已經有A&#xff0c;B兩張表&#xff0c;現在我創建了一張表C,C是由A,B兩張表經過一條SQL處理得到的&#xff0c;這個時候我們…