欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用

 更新時(shí)間:2022年07月02日 10:44:03   作者:剛?cè)腴T的小仙女  
宏定義是用宏名來表示一個(gè)字符串,在宏展開時(shí)又以該字符串取代宏名,這只是一種簡單的替換。字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查,如有錯(cuò)誤,只能在編譯已被宏展開后的源程序時(shí)發(fā)現(xiàn)

宏定義與預(yù)處理命令

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

預(yù)處理命令 - 宏定義

定義符號(hào)常量

#define PI 3.1415926
#define MAX_N 10000

定義傻瓜表達(dá)式

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

定義代碼段

\ 為連接符

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

預(yù)定義的宏

常見的預(yù)定義的宏

說明
__ DATE__日期:Mmm dd yyyy
__ TIME__時(shí)間:hh:mm:ss
__ LINE__行號(hào)
__ FILE__文件名
__ func__函數(shù)名/非標(biāo)準(zhǔn)
__ FUNC__函數(shù)名/非標(biāo)準(zhǔn)
__ PRETTY_FUNCTION__更詳細(xì)的函數(shù)信息/非標(biāo)準(zhǔn)

示例:

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

函數(shù) VS 宏定義

作用時(shí)期:函數(shù)作用在編譯期,宏定義作用在預(yù)編譯期;

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

預(yù)處理命令 - 條件式編譯

函數(shù)說明
#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宏 則結(jié)果為 420 個(gè)字節(jié) 
	//如果定義了DEBUG宏,則結(jié)果為 4020 個(gè)字節(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的函數(shù),輸出所在函數(shù)及行號(hào)等信息

#include<stdio.h>
//打開log宏
#define DEBUG
//條件式編譯
//變參宏
//args加##后表連接 此時(shí)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;
} 

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

相關(guān)文章

  • C語言實(shí)現(xiàn)簡易通訊錄實(shí)例

    C語言實(shí)現(xiàn)簡易通訊錄實(shí)例

    大家好,本篇文章主要講的是C語言實(shí)現(xiàn)簡易通訊錄實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • 淺談c語言中一種典型的排列組合算法

    淺談c語言中一種典型的排列組合算法

    下面小編就為大家?guī)硪黄獪\談c語言中一種典型的排列組合算法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • C++ string替換指定字符實(shí)例代碼

    C++ string替換指定字符實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于C++ string替換指定字符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Qt自定義控件實(shí)現(xiàn)線條型加載條

    Qt自定義控件實(shí)現(xiàn)線條型加載條

    這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)線條型加載條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 淺析C語言字中的符串格式化顯示

    淺析C語言字中的符串格式化顯示

    以下是對(duì)C語言字中的符串格式化顯示進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C語言中單鏈表的基本操作(創(chuàng)建、銷毀、增刪查改等)

    C語言中單鏈表的基本操作(創(chuàng)建、銷毀、增刪查改等)

    這篇文章主要介紹了C語言中單鏈表的基本操作(創(chuàng)建、銷毀、增刪查改等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • centos 7 vscode cmake 編譯c++工程的教程詳解

    centos 7 vscode cmake 編譯c++工程的教程詳解

    這篇文章給大家介紹了centos 7 使用vscode+cmake配置簡單c++項(xiàng)目的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-05-05
  • C++實(shí)現(xiàn)訪問者模式的基礎(chǔ)介紹

    C++實(shí)現(xiàn)訪問者模式的基礎(chǔ)介紹

    訪問者模式表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。對(duì)C++訪問者模式相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-09-09
  • C++ 冒泡排序數(shù)據(jù)結(jié)構(gòu)、算法及改進(jìn)算法

    C++ 冒泡排序數(shù)據(jù)結(jié)構(gòu)、算法及改進(jìn)算法

    冒泡排序是一種簡單排序。這種排序是采用“冒泡策略”將最大元素移到最右邊。在冒泡過程中,相鄰兩個(gè)元素比較,如果左邊大于右邊的,則進(jìn)行交換兩個(gè)元素。這樣一次冒泡后,可確保最大的在最右邊。然后執(zhí)行n次冒泡后排序即可完畢
    2013-04-04
  • C++詳解如何實(shí)現(xiàn)單鏈表

    C++詳解如何實(shí)現(xiàn)單鏈表

    線性表的鏈?zhǔn)酱鎯?chǔ)又稱為單鏈表,它是指通過一組任意的存儲(chǔ)單元來存儲(chǔ)線性表中的數(shù)據(jù)元素。本文將用C++實(shí)現(xiàn)單鏈表,需要的可以參考一下
    2022-06-06

最新評(píng)論