宏定義基本用法

宏定義

不帶參數

宏定義又稱為宏代換、宏替換,簡稱“宏”。

格式:

#define 標識符 字符串

其中的標識符就是所謂的符號常量,也稱為“宏名”。
預處理(預編譯)工作也叫做宏展開:將宏名替換為字符串。
掌握”宏”概念的關鍵是“換”。一切以換為前提、做任何事情之前先要換,準確理解之前就要“換”。

例:

#define Pi 3.1415926

把程序中出現的Pi全部換成3.1415926

帶參數(宏函數)

宏名之后帶括號的宏被認為是宏函數。用法和普通函數一樣,只不過在預處理階段,宏函數會被展開。優點是沒有普通函數保存寄存器和參數傳遞的開銷,展開后的代碼有利于CPU cache的利用和指令預測,速度快。缺點是可執行代碼體積大。

和不帶參數的宏定義一樣,除了一般的字符串替換,還要做參數代換。

格式:

#define <宏名> (<參數表>) <宏體>

例如:

#define S(a,b) a*b

area=S(3,2);第一步被換為area=a * b; ,第二步被換為area=3 * 2;

(1)實參如果是表達式容易出問題

例如:

#define S(r) r*r

area=S(a+b);第一步換為area=r * r;,第二步被換為area=a+b * a+b;

正確的宏定義是#define S(r) ((r)*(r))

(2)帶參宏一般用法

例如:

#define MIN(A, B)   A < B ? A : Bint a = 2 * MIN(3, 4);
printf("%d", a);

展開結果:

int a = 2 * MIN(3, 4);
//=> int a = 2 * 3 < 4 ? 3 : 4;
//=> int a = 6 < 4 ? 3 : 4;
//=> int a = 4;

正確如下:

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

則遇到MAX(1+2,value)則會把它替換成:
((1+2)>(value)?(1+2):(value))

(3)有參宏定義中#的用法

需要注意的是凡宏定義里有用’#’或’##’的地方宏參數是不會再展開,被當做字符串處理

#define STR(str) #str

“#”號用于把宏定義中的參數兩端加上字符串的”“

比如,這里 STR(my#name) 會被替換成”my#name”

(4)有參宏定義中##的用法

例如:

#define WIDE(str) L##str

則會將形參str的前面加上L

比如:

WIDE(“abc”)就會被替換成L”abc”

如果有:

#define FUN(a,b) vo##a##b()

那么FUN(id ma,in)會被替換成void main()

多行宏定義

每一次換行都必須要有 “ \ ”結尾,末尾行不需要“ \ ” 結尾。

例如:

#define doit(m,n) for(int i=0;i<(n);++i)\
    {\
    m+=i;\
    }
#define WARN_IF(EXP) \do { if (EXP) \fprintf (stderr, "Warning: " #EXP "\n"); } \while (0)

WARN_IF (x == 0);會被擴展成:

do 
{ if (x == 0)fprintf (stderr, "Warning: " "x == 0" "\n"); 
}
while (0);
#define VAR_TO_STR(var)\({\std::string name = (#var);\int pos = 0;\int length = 0;\length = name.length();\pos = name.find_last_of(':',length);\if ( pos == -1 )\{\pos = 0;\name = name.substr(pos,length);\}\else\{\name = name.substr( pos + 1,length);\}\(name);\})

std::string str = VAR_TO_STR(VDAD::RRR) 展開后:

int main()
{std::string ss =({std::string name = ("VDAD::RRR");int pos = 0;int length = 0;length = name.length();pos = name.find_last_of(':',length);if ( pos == -1 ){pos = 0;name = name.substr(pos,length);}else{name = name.substr( pos + 1,length);}(name);});cout << ss<< endl;return 0;
}

輸出為:

相關鏈接

1.C語言宏的特殊用法和幾個坑
2.C/C++ 宏定義

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

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

相關文章

廣度優先搜索練習之神奇的電梯

廣度優先搜索練習之神奇的電梯 Time Limit: 1000ms Memory limit: 65536K 題目描述 有一座已知層數為n的高樓&#xff0c;這座高樓的特殊之處在于只能靠電梯去上下樓&#xff0c;所以要去到某一層要非常耽誤時間&#xff0c;然而更悲哀的是&#xff0c;這座高樓的電梯是限號…

ubuntu安裝proxychains及自動補全

proxychains ProxyChains是本人目前為止用到的最方便的代理工具。 inux下代理一般是通過http_proxy和https_proxy這兩個環境變量&#xff0c;但是很多軟件并不使用這兩個變量&#xff0c;導致流量無法走代理。在不使用vpn的前提下&#xff0c;linux并沒有轉發所有流量的真全局…

快速冪講解

快速冪的目的就是做到快速求冪&#xff0c;假設我們要求a^b,按照樸素算法就是把a連乘b次&#xff0c;這樣一來時間復雜度是O(b)也即是O(n)級別&#xff0c;快速冪能做到O(logn)&#xff0c;快了好多好多。它的原理如下&#xff1a; 假設我們要求a^b&#xff0c;那么其實b是可以…

如何查詢資料

如何查詢資料技術資料及問題查詢查詢方法分類查找提取關鍵字GitHub項目優先使用Google搜索引擎Copy Paste論文查找詢問主管 測試修改使用總結分享 公司信息查詢國內公司國外公司 如何查詢資料 技術資料及問題查詢 查詢方法 資料與解決辦法的查詢大致分為7大類。 1.分類查…

山東省第八屆 ACM 省賽 sum of power(SDUT 3899)

Problem Description Calculate ∑ni1im mod (10000000007) for given n&#xff0c;m. Input Input contains two integers n,m(1≤n≤1000,0≤m≤10). Output Output the answer in a single line. Example Input 10 0 Example Output 10 方法&#xff1a;快速冪和大數求和 …

Ubuntu主題更換

Ubuntu主題更換 目前的Ubuntu有Unity和Gnome兩個比較流行的版本&#xff0c;以下為Gnome桌面環境的主題更換&#xff0c;其他桌面環境類似。 主題的下載地址&#xff0c;點擊 Theme 將在網絡上下載的主題文件進行解壓&#xff0c;然后拷貝到 /usr/share/themes/ 目錄下&…

awk簡單使用

awk 用于在linux/unix下對文本和數據進行處理,支持用戶自定義函數和動態正則表達式等先進功能。 命令格式&#xff1a; awk BEGIN{ print “start” } pattern { commend } END{print "end"} file awk "BEGIN{ print “start” } pattern { commend } END{pr…

Ubuntu 14.04 下 Virtual Judge 的搭建

前期準備工作 1.1 一個Linux系統 因為現場賽的緣故&#xff0c;我一直使用的都是ubuntu。 這里我測試用的是Ubuntu14.04 Desktop 64bit ,當然選擇Server會更好一些. 系統的安裝不再贅述&#xff0c;作為服務器請選用Server版本。1.2 更新源 在搭建環境之前&#xff0c;請確保…

BitMap的原理介紹與實現

BitMap 位圖&#xff08;bitmap&#xff09;是一種非常常用的結構&#xff0c;在索引&#xff0c;數據壓縮等方面有廣泛應用。位圖是通過將數組下標與應用中的一些值關聯映射&#xff0c;數組中該下標所指定的位置上的元素可以用來標識應用中值的情況&#xff08;是否存在或者數…

MySQL與PHP連接

1、mysql_connect()-建立數據庫連接 格式&#xff1a; resource mysql_connect([string hostname [:port] [:/path/to/socket] [, string username] [, string password]]) 例&#xff1a; $conn mysql_connect("localhost", "username", "pa…

QML Profiler性能優化教程

QML Profiler 2018年1月26日 vincent 對于一個程序的開發&#xff0c;性能優化是開發中的一個重要步驟。 我們肯定不希望開發出來的程序表現出卡頓&#xff0c;最好是處處流暢&#xff0c;絲滑般的體驗。 對于C程序&#xff0c;我們有很多方法可以做性能優化&#xff0c;例如…

uburntu在不能自動獲取網絡時的聯網設置

一&#xff1a;網絡基礎配置 1. eth0設置不正確&#xff0c;導致無法正常啟動&#xff0c;修改eth0配置文件就好 ubuntu 12.04的網絡設置文件是/etc/network/interfaces&#xff0c;打開文件&#xff0c;會看到 auto lo iface lo inet loopback 這邊的設置是本地回路。在后…

計算機顯卡知識普及

顯卡知識普及 一、什么是顯卡&#xff1f; 顯示接口卡&#xff08;Video card&#xff0c;Graphics card&#xff09;、顯示器配置卡簡稱為顯卡&#xff0c;是個人電腦基本組成部分之一。 用途是將計算機系統所需要的顯示信息進行轉換驅動&#xff0c;并向顯示器提供信號&…

整除的尾數

Problem Description 一個整數&#xff0c;只知道前幾位&#xff0c;不知道末二位&#xff0c;被另一個整數除盡了&#xff0c;那么該數的末二位該是什么呢&#xff1f; Input 輸入數據有若干組&#xff0c;每組數據包含二個整數a&#xff0c;b(0<10000,10<b<100)&…

QML 控件大全

QML TypeContainerDelayButtonDialDialogButtonBoxDialogDrawerMenuMenuBarOverlayPageIndicatorRangeSliderScrollViewSpinBoxStackViewSwipeViewSwitchTabBarToolBarToolSeparatorToolTipTumbler QML Type 本篇主要介紹QtQuick Controls 2,Qt Creator 5.10 1.Container im…

斐波那契的整除

Description 已知斐波那契數列有如下遞歸定義&#xff0c;f(1)1,f(2)1, 且n>3,f(n)f(n-1)f(n-2)&#xff0c;它的前幾項可以表示為1&#xff0c; 1&#xff0c;2 &#xff0c;3 &#xff0c;5 &#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34…&#xff0c;現在的…

Qt與QML的枚舉綁定(C++枚舉)

Qt到QML的枚舉綁定 QML中是不支持c的枚舉類型的&#xff0c;所以我們可以使用Qt的元對象系統&#xff0c;即MOS,來幫助我們實現。 進行綁定的好處就是&#xff0c;以后數據發生變化的時候&#xff0c;就是枚舉發生增加修改&#xff0c;添加等的時候&#xff0c;不需要在QML中…

深入理解Qt的.pro文件

深入理解Qt的pro文件模板變量生成目錄生成的應用程序名編譯選項目標文件目錄包含頭文件包含源文件包含資源文件附加頭文件包含鏈接庫預編譯宏平臺相關性處理指定來自ui文件位置指定界面翻譯文本列表指定圖標 深入理解Qt的.pro文件 一般Qt項目我們是使用Qt Creator自動生成的&…

Ubuntu 用vsftpd 配置FTP服務器

最近開學&#xff0c;有好多課程結束后都需要將文件考到優盤里&#xff0c;而本人又有健忘的毛病&#xff0c;經常忘記帶優盤&#xff0c;所以就搭建了自己的ftp服務器&#xff0c;也算是用技術放松自己吧。閑話少敘&#xff0c;進入正題&#xff1a; 網上關于ftp搭建的文章很…

linux的程序打包deb

deb安裝包 deb是Unix系統(其實主要是Linux)下的安裝包&#xff0c;基于 tar 包&#xff0c;因此本身會記錄文件的權限(讀/寫/可執行)以及所有者/用戶組。 由于 Unix 類系統對權限、所有者、組的嚴格要求&#xff0c;而 deb 格式安裝包又經常會涉及到系統比較底層的操作&#…