最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言詳細分析宏定義與預處理命令的應用

 更新時間:2022年07月02日 10:44:03   作者:剛入門的小仙女  
宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的替換。字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查,如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現

宏定義與預處理命令

  • 預處理階段:處理宏定義與預處理命令;
  • 編譯期:檢查代碼,分析語法、語義等,最后生成.o或.obj文件;
  • 鏈接期:鏈接所有的.o或.obj文件,生成可執(zhí)行文件。

預處理命令 - 宏定義

定義符號常量

#define PI 3.1415926
#define MAX_N 10000

定義傻瓜表達式

#define MAX(a, b) (a) > (b) ? (a) : (b)
#define S(a, b) a * b

定義代碼段

\ 為連接符

#define P(a) { \
	printf("%d\n", a); \
}

預定義的宏

常見的預定義的宏

說明
__ DATE__日期:Mmm dd yyyy
__ TIME__時間:hh:mm:ss
__ LINE__行號
__ FILE__文件名
__ func__函數名/非標準
__ FUNC__函數名/非標準
__ PRETTY_FUNCTION__更詳細的函數信息/非標準

示例:

#include<stdio.h>
int main(){
	//首次編譯的時間
	//[Jun 10 2022 09:46:48]
	printf("[%s %s]\n", __DATE__, __TIME__);
	//代碼行號:文件名:函數名
	//[6 : E:\2023考研\(zhòng)專業(yè)課\C語言\define.cpp : main]
	printf("[%d : %s : %s]\n", __LINE__, __FILE__, __func__);
	return 0;
}

函數 VS 宏定義

作用時期:函數作用在編譯期,宏定義作用在預編譯期;

使用:函數需要利用額外的棧,因此需要額外的時間開銷,相比宏定義更加節(jié)約時間但會浪費更多空間;

預處理命令 - 條件式編譯

函數說明
#ifdef DEBUG是否定義了BEBUG宏
#ifndef DEBUG是否沒定義DEBUG宏
#if MAX_N == 5宏 MAX_N 是否等于5
elif MAX_N == 4否則宏MAX_N是否等于4
#else 
#endif 

示例:

#include<stdio.h>
//定義DEBUG宏
#define DEBUG 
//判斷是否定義了DEBUG宏
#ifdef DEBUG
#define MAX_N 1000
#else
#define MAX_N 100
#endif 
int main(){
	int arr[MAX_N + 5] = {0};
	//如果沒定義了DEBUG宏 則結果為 420 個字節(jié) 
	//如果定義了DEBUG宏,則結果為 4020 個字節(jié) 
	printf("sizeof(arr) = %lu \n", sizeof(arr)); 
	return 0;
}

示例

沒有BUG的MAX宏

#define MAX(a, b)({\
	__typeof(a) _a = a;\
	__typeof(b) _b = b;\
	_a > _b ? _a:_b;\
})

打印LOG的函數,輸出所在函數及行號等信息

#include<stdio.h>
//打開log宏
#define DEBUG
//條件式編譯
//變參宏
//args加##后表連接 此時args可為空 
#ifdef DEBUG
#define log(format, args...){\
	printf("[%s : %s : %d] ", __FILE__, __func__, __LINE__);\
	printf(format, ##args);\
	printf("\n");\
}
#else
#define log(format, args...)
#endif
int main(){
	int a = 123, b = 13;
	//[E:\2023考研\(zhòng)專業(yè)課\C語言\log.cpp : main : 12] a = 123, b = 13
	log("a = %d, b = %d", a, b);
	//[E:\2023考研\(zhòng)專業(yè)課\C語言\log.cpp : main : 13] hello
	log("hello");
	return 0;
} 

到此這篇關于C語言詳細分析宏定義與預處理命令的應用的文章就介紹到這了,更多相關C語言宏定義內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ vector的用法小結

    C++ vector的用法小結

    這篇文章主要介紹了c++中,vector是一個十分有用的容器,下面對這個容器做一下總結
    2013-12-12
  • C++11中的stoi & stod用法

    C++11中的stoi & stod用法

    這篇文章主要介紹了C++11中的stoi & stod用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C++?正則表達式的應用詳解

    C++?正則表達式的應用詳解

    正則表達式(regular?expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等
    2021-11-11
  • 用C語言模仿Python函數的實例

    用C語言模仿Python函數的實例

    下面小編就為大家?guī)硪黄肅語言模仿Python函數的實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • OpenCV圖像處理之常見的圖像灰度變換

    OpenCV圖像處理之常見的圖像灰度變換

    這篇文章主要介紹了OpenCV圖像處理之常見的圖像灰度變換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • C++輸入輸出注意事項總結

    C++輸入輸出注意事項總結

    這篇文章主要介紹了C++輸入輸出注意事項總結,對C++的輸入輸出各個注意事項進行了很好的總結,需要的朋友可以參考下
    2014-08-08
  • string居然也可以用<<和>>

    string居然也可以用<<和>>

    今天小編就為大家分享一篇關于string居然也可以用<<和>>,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C語言變長數組使用詳解

    C語言變長數組使用詳解

    這篇文章主要介紹了C語言變長數組使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • C語言詳解結構體的內存對齊與大小計算

    C語言詳解結構體的內存對齊與大小計算

    C 數組允許定義可存儲相同類型數據項的變量,結構是 C 編程中另一種用戶自定義的可用的數據類型,它允許你存儲不同類型的數據項,本篇讓我們來了解C 的結構體內存對齊與計算大小
    2022-04-04
  • MFC中動態(tài)創(chuàng)建控件以及事件響應實現方法

    MFC中動態(tài)創(chuàng)建控件以及事件響應實現方法

    這篇文章主要介紹了MFC中動態(tài)創(chuàng)建控件以及事件響應實現方法,詳細講解了MFC中動態(tài)創(chuàng)建控件以及事件響應的概念與實現方法,具有一定的實用價值,需要的朋友可以參考下
    2014-10-10

最新評論

平塘县| 陕西省| 烟台市| 宣汉县| 岳普湖县| 慈溪市| 遵义市| 镇原县| 乌拉特前旗| 蛟河市| 密云县| 介休市| 合肥市| 江孜县| 游戏| 成安县| 崇礼县| 沾益县| 土默特右旗| 青州市| 武隆县| 华宁县| 泗洪县| 贵州省| 习水县| 勃利县| 株洲县| 华容县| 南昌县| 东阿县| 格尔木市| 墨玉县| 曲松县| 漳平市| 信宜市| 武定县| 太谷县| 西丰县| 确山县| 商洛市| 滕州市|