學習筆記15-C語言-預處理指令、條件編譯、頭文件

預處理指令:

程序猿編寫的代碼不是標準C代碼,并不能被真正的編譯器索編譯,需要一段程序把代碼翻譯一下。
翻譯的過程叫做預處理,被翻譯的代碼叫做預處理指令,以#開頭的都是預處理指令查看預處理的過程:gcc -E code.c   把預處理結果顯示在終端上gcc -E code.c -o code.i 把預處理的結果存儲到code.i文件中預處理指令的分類:#inlcude    文件包含#include<>  從系統指定目錄下查找并導入頭文件#include""  先從文件當前目錄下找,找到就導入該頭文件;如果找不到,再從系統指定目錄下找并導入頭文件操作系統通過環境變量來指定頭文件的查找路徑,或者通過設置編譯參數來指定頭文件的查找路徑-I/path.bashrc#define     宏定義宏常量:    #define MAX 100優點:提高代碼的擴展性(方便批量修改)、提高可讀性、提高安全性、還可以在case后面使用注意:一般宏名全部大寫,末尾不要加分號【局部變量全部小寫、全局變量首字母大寫、指針變量+p、數組arr、字符串str、函數名全部小寫+下劃線】預定義好的宏:__func__    獲取函數名__FILE__    獲取文件名__LINE__    獲取當前行號__DATE__    獲取當前日期__TIME__    獲取運行時間宏函數:    其實就是帶參數的宏宏函數不是真正的函數,不檢查參數類型,沒有傳參,沒有返回值,只有計算的結果#define sum(a,b) a+b1、把代碼使用到的宏函數替換為宏函數后面的代碼。2、再把宏函數代碼中使用到的參數替換為調用者提供的參數宏函數的二義性:由于宏代碼所處的位置、參數不同導致宏有不同的功能,這就叫做宏的二義性。如何避免宏的二義性:1、宏函數整體加小括號,每個參數都加小括號2、使用宏函數時,不要提供帶自變運算符的變量作為參數注意1:容易出選擇題,例如:哪個宏有二義性、宏函數的運算結果注意2:定義宏盡量別換行,如果要換行要在每行末尾加上續航符\,建議宏函數最外面加上大括號運算符:#       把宏函數的參數變成字符串##      合并兩個參數變成一個標識符普通函數與宏函數的區別?它們是什么:普通函數:是一段具有某項功能的代碼段,會被編譯成二進制指令存儲到代碼段內存中,函數名就是首地址,有獨立的命名空間、棧內存宏函數:是一個帶參數的宏,并不是真正的函數,而只是代碼的替換,僅僅只是使用起來像函數有什么不一樣:函數:      返回值      類型檢查    安全    壓棧、出棧  速度慢  跳轉宏函數:    運算結果    通用        危險    替換       速度快  冗余條件編譯:根據條件決定那些代碼是否參與最終的編譯版本控制:#if#elif#else#endif頭文件衛士:防止頭文件被重復包含#ifndef 宏名#define 宏名#endif 判斷調試:#ifdef 宏名(DEBUG)#else#endif用于輸出調試信息:#ifdef DEBUG#define debug(...) printf(__VA_ARGS__)#else   #define debug(...)#endif#define error(...) printf("%s:%s:%d %s:%m %s %s\n",__FILE__,__func__,__LINE__,__VA_ARGS__,__DATE__,__TIME__)

頭文件應該怎么寫:

問題:頭文件可能被任意個源文件包含,意味著頭文件中的內容會在多個目標文件中存在,合并時不能有沖突。
重點:頭文件中只能編寫聲明語句,不能有定義語句全局變量聲明    extern int num;函數聲明        宏常量宏函數typedef 類型重定義結構、聯合、枚舉的類型聲明

頭文件的編寫原則:

1、為每一個.c文件編寫一份.h文件,.h文件是對.c文件的說明
2、如果需要用到某個.c文件中的函數、變量、宏,只需要把它的頭文件導入
3、.c也需要導入它的.h文件,目的是為了讓聲明和定義一致

頭文件的相互包含:

假如a.h包含了b.h,b.h有需要包含a.h,這種情況叫做頭文件的相互包含,這種情況就會編譯出錯。
錯誤:未知類型名錯誤“xxx”,一般都是因為頭文件相互包含導致的(還可能是復制文件時粗心,忘記改宏名)
解決方案:把a.h中需要的內容,和b.h中需要的內容提取出來,編寫一個c.h
注意:頭文件的相互包含和重復包含的區別

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

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

相關文章

學習筆記16-C語言-小項目-使用Makefile完成2048

Makefile: Makefile是一系列編譯指令組成的可執行文本&#xff0c;也叫做編譯腳本。 在終端執行make命令會自動執行Makefile腳本中的編譯命令&#xff0c; 而且它還可以根據文件的最后修改時間來判斷哪些文件是否需要重新編譯、哪些文件不需要重新編譯&#xff0c;從而大大提高…

學習筆記17-C語言-結構、聯合、枚舉

結構&#xff1a; struct 結構是由程序猿自己設計的一種數據類型&#xff0c;用于描述一個事務的各項數據&#xff0c;由若干個不同的基礎數據類型組成。設計結構&#xff1a;struct 結構體名{類型 成員名&#xff1b;...}&#xff1b;定義結構體變量struct 結構體名 變量名&a…

Maven 3.0.5 安裝和配置:

摘要&#xff1a;現在的Web項目越來越多的都用maven管理了&#xff0c;所以我也抽時間學習學習&#xff0c;為了趕上時代&#xff01; 一&#xff1a;首先到maven官網&#xff1a;http://maven.apache.org/&#xff0c;然后選擇相應的版本下載&#xff0c;我這里下載的是maven…

學習筆記18-C語言-文件

文件的分類&#xff1a; 文本文件&#xff1a; 存儲的是ASCII碼值的二進制 二進制文件&#xff1a; 存儲的是數據的補碼文件IO&#xff1a; FILE *fopen(const char *path, const char *mode); 功能&#xff1a;打開或者創建文件 path&#xff1a;文件的路徑 mode&#x…

使用INNER JOIN ON 多表關聯查詢,獲取指定用戶下指定權限的資源SQL:

摘要&#xff1a;最近在看一個開源框架&#xff0c;其中用戶&#xff0c;角色&#xff0c;資源&#xff0c;這塊我感覺比較重要&#xff0c;所以就自己也模仿著寫了下&#xff0c;其中在獲取指定用戶下的權限資源的時候遇到問題了&#xff0c;開始時&#xff0c;我首先想到的方…

Maven學習記錄之maven基本操作命令,maven本地工廠的創建,maven骨架的生成,以及在eclipse中創建maven工程:...

摘要&#xff1a;今天又學習了一下maven&#xff0c;之前是下載并安裝和配置好了maven的環境&#xff0c;今天主要學習的內容包括&#xff1a;maven本地工廠的創建&#xff0c;maven骨架的生成命令&#xff0c;maven在dos下創建maven工程&#xff0c;以及在eclipse中創建mavne工…

Oracle中通過游標執行帶參數的存儲過程實現解析CLOB字段內的xml字符串:

摘要&#xff1a;近來之前的項目數據出現了問題&#xff0c;原因是由于之前在設計數據庫的時候把時間字段設置成了字符串格式&#xff0c;所以給后期的數據操作帶來了很大的麻煩&#xff0c;這里提醒一下各位程序猿&#xff0c;以后在開發項目的時候時間字段一定要是時間字段&a…

Eclipse中使用Checkstyle,checkstyle插件檢查java代碼的自定義配置文件:

摘要&#xff1a;近來項目組在搞代碼檢查&#xff0c;所以領導讓把checkstyle這個插件搞明白&#xff0c;現在我把我們寫的自定義的checkstyle.xml文件記錄一下&#xff0c;以便大家可以一起使用&#xff1a; 一&#xff1a;要使用checkstyle插件在eclipse中檢查java代碼&…

Linux 下安裝 jdk-7u75-linux-x64.gz,jdk1.7.0_75,jdk1.7步驟:

摘要&#xff1a;近來又用到了Linux系統&#xff0c;所以就又新裝了一個虛擬機和CentOS 6.4來用&#xff0c;搞開發的程序猿們可能都知道&#xff0c;在現在的很多企業中&#xff0c;生產環境大多都是Linux服務器&#xff0c;并且用的比較多的大都是CentOS&#xff0c;Red hat系…

Win7+VMware10.0+CentOS 6.4+Tomcat,Win7訪問不了CentOS6.4上的Tomcat

摘要&#xff1a;今天在linux下安裝Tomcat后&#xff0c;在虛擬機本地通過:http://localhost:8080/可以訪問安裝好的Tomcat服務器&#xff0c;但是在本機就不能訪問&#xff0c;前提是在本機下可以ping的通虛擬機的IP地址的&#xff0c;最后經過Google&#xff0c;發現說可能是…

Linux下配置OpenLDAP服務記錄

摘要&#xff1a;最近部門需要整合所有的系統&#xff0c;所以領導說要通過OpenLdap數據庫來實現對所有系統的統一管理&#xff0c;所以需要在服務器上配置一下LDAP服務&#xff0c;我們這里選擇的是OpenLdap服務&#xff0c;我在網上搜索了很多&#xff0c;開始都沒有配置成功…

Linux下配置CollabNet Subversion Edge

摘要&#xff1a;最近一直都在搞一下管理員的工作&#xff0c;今天又搞了svn的管理工具CollabNetSubversionEdge&#xff0c;網上也有很多例子&#xff0c;但是很多都是可以訪問到web界面&#xff0c;但是不能啟動版本庫的服務&#xff0c;所以我經過多次嘗試&#xff0c;終于解…

養成讓自己進步的10個習慣

養成讓自己進步的10個習慣 1.永遠不說不可能。"辦法總比問題多" 2.凡事第一反應找方法&#xff0c;不是找借口。"不要推卸責任" 3.養成記錄習慣&#xff0c;不太依賴腦袋。"好記性不如爛筆頭" 4.每天出門照鏡子&#xff0c;給自己自信的微笑。&…

Oracle存儲過程中使用游標來批量解析CLOB字段里面的xml字符串:

摘要&#xff1a;之前在項目中使用到了Oracle數據庫中通過觸發器去調用存儲過程執行數據解析并Update到對應的數據表中&#xff0c;但是&#xff0c;經過一段時間的測試使用發現&#xff0c;如果job那天停掉了&#xff0c;然后你再重新新建job的話&#xff0c;這時候可能會有很…

Maven配置nexus

摘要&#xff1a;近來一直在搭建maven結構的開發框架&#xff0c;其中這個過程中用到了nexus私服&#xff0c;這里我把我經過查詢總結的最終的方式記錄一下&#xff0c;以便后面忘記了&#xff1a; 一&#xff1a;nexus私服的安裝(略) 二&#xff1a;倉庫的講解如下圖: 1、ho…

Maven項目發布的配置

摘要&#xff1a;要想發布maven結構的項目到nexus私服上&#xff0c;可以通過兩種方式來&#xff0c;一種是在項目的pom.xml文件里面配置&#xff0c;另一種是通過命令的方式發布到nexus私服上&#xff0c;但是這種方式的前提也得在settings.xml文件配置用戶: 一&#xff1a;M…

MariaDB通過命令行的方式導出指定數據庫和還原指定數據庫

摘要&#xff1a;今天由于需要需要從本地導出一份VP系統的數據庫腳本&#xff0c;以前我都是通過工具直接導出&#xff0c;現在有同事說可以通過mysql的命令方式導出&#xff0c;我試了一下&#xff0c;可以&#xff0c;現在記錄一下&#xff01; 一&#xff1a;在MariaDB的安裝…

java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener

一&#xff1a;如果出現下面的錯誤信息&#xff0c;如果你的項目是Maven結構的&#xff0c;那么一般都是你的項目的Maven Dependencies沒有添加到項目的編譯路徑下&#xff1a; 五月 10, 2015 6:23:18 下午 org.apache.catalina.core.AprLifecycleListener init 信息: The APR …

Maven 打成 Webjar的方法

摘要&#xff1a;今天領導說要把自己定義的樣式文件和js文件打成一個自定義的webjar&#xff0c;所以就寫了一下&#xff0c;現在記錄一下&#xff1a; 1. 先把要打包成webjar的文件放到你新建的maven結構的項目的/src/main/resources目錄下 2.編寫該項目的pom.xml文件&#…

Maven中maven-source-plugin,maven-javadoc-plugin插件的使用:

摘要&#xff1a;今天領導說要把項目通過maven生產源碼包和文檔包并發布到自己的私服上&#xff0c;經過查看mavne官網發現有兩個maven插件可以做到這些工作&#xff0c;一個是maven-source-plugin&#xff0c;另一個是maven-javadoc-plugin&#xff0c;現在記錄一下&#xff0…