C語言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用
宏定義與預(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語言中單鏈表的基本操作(創(chuàng)建、銷毀、增刪查改等)
這篇文章主要介紹了C語言中單鏈表的基本操作(創(chuàng)建、銷毀、增刪查改等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02centos 7 vscode cmake 編譯c++工程的教程詳解
這篇文章給大家介紹了centos 7 使用vscode+cmake配置簡單c++項(xiàng)目的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-05-05C++實(shí)現(xiàn)訪問者模式的基礎(chǔ)介紹
訪問者模式表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。對(duì)C++訪問者模式相關(guān)知識(shí)感興趣的朋友一起看看吧2021-09-09C++ 冒泡排序數(shù)據(jù)結(jié)構(gòu)、算法及改進(jìn)算法
冒泡排序是一種簡單排序。這種排序是采用“冒泡策略”將最大元素移到最右邊。在冒泡過程中,相鄰兩個(gè)元素比較,如果左邊大于右邊的,則進(jìn)行交換兩個(gè)元素。這樣一次冒泡后,可確保最大的在最右邊。然后執(zhí)行n次冒泡后排序即可完畢2013-04-04