主頁(yè):114514的代碼大冒
qq:2188956112(歡迎小伙伴呀hi?(。???。)??)
Gitee:莊嘉豪 (zhuang-jiahaoxxx) - Gitee.com
文章目錄
目錄
文章目錄
前言
2.5帶副作用的宏參數(shù)
2.6宏和函數(shù)的對(duì)比
3#undef
?編輯
4 命令行定義
5 條件編譯
6 文件包含
總結(jié)
前言
咱們書接上回
2.5帶副作用的宏參數(shù)
先來(lái)看一段代碼
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
int a = 4;
int b = 6;
int m = MAX(a++, b++);
printf("%d\n", m);
printf("a=%d b=%d\n", a, b);
return 0;
}
這個(gè)結(jié)果是什么呢?
?為什么?
我們一樣要考上文中的“宏是一種替換”的概念,先做一下替換然后我們來(lái)解析一下
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-796987.html
x+1;//不帶副作用
x++;//帶有副作用
但是在這里這種情況,函數(shù)就不會(huì)發(fā)生類似問(wèn)題
這里我提供了測(cè)試代碼,讀者可自取
#define MAX(x,y) ((x)>(y)?(x):(y))
int Max(int x, int y)
{
return x > y ? x : y;
}
int main()
{
//int m = MAX(2, 3);
//printf("%d\n", m);
int a = 4;
int b = 6;
int m = MAX(a++, b++);
//int m = Max(a++, b++);
printf("%d\n", m);
// m = 7
printf("a=%d b=%d\n", a, b);
return 0;
}
2.6宏和函數(shù)的對(duì)比
函數(shù)的反匯編
宏的反匯編
?
宏明顯要快不少嘛
1. 用于調(diào)用函數(shù)和從函數(shù)返回的代碼可能比實(shí)際執(zhí)行這個(gè)小型計(jì)算工作所需要的時(shí)間更多。所以宏比函數(shù)在程序的規(guī)模和速度方面更勝一籌 。2. 更為重要的是函數(shù)的參數(shù)必須聲明為特定的類型。所以函數(shù)只能在類型合適的表達(dá)式上使用。反之這個(gè)宏怎可以適用于整形、長(zhǎng)整型、浮點(diǎn)型等可以用于> 來(lái)比較的類型。宏是類型無(wú)關(guān)的 。
?宏的缺點(diǎn)
當(dāng)然和函數(shù)相比宏也有劣勢(shì)的地方:1. 每次使用宏的時(shí)候,一份宏定義的代碼將插入到程序中。除非宏比較短,否則可能大幅度增加程序的長(zhǎng)度。2. 宏是沒(méi)法調(diào)試的。3. 宏由于類型無(wú)關(guān),也就不夠嚴(yán)謹(jǐn)。4. 宏可能會(huì)帶來(lái)運(yùn)算符優(yōu)先級(jí)的問(wèn)題,導(dǎo)致程容易出現(xiàn)錯(cuò)。
?宏沒(méi)有類型,如上圖所示,函數(shù)只能進(jìn)行固定類型數(shù)據(jù)的操作,而宏卻可以忽視這一細(xì)節(jié)
但是對(duì)應(yīng)的,宏是一種替換,也就是說(shuō),他會(huì)把定義的內(nèi)容替換到正文代碼中,造成代碼超度變長(zhǎng)
另外就是像上文所說(shuō)的那種“副作用”,足以看出宏在調(diào)試時(shí)的問(wèn)題是比較大的,
因?yàn)椤澳憧吹降牟⒎悄憧吹降模ê晏鎿Q的關(guān)系)”
所以總的說(shuō)來(lái),宏有著優(yōu)點(diǎn)也有著缺點(diǎn)
具體使用函數(shù)還是宏,要根據(jù)實(shí)際情況
屬
性
|
#define
定義宏
|
函數(shù)
|
代
碼
長(zhǎng)
度
|
每次使用時(shí),宏代碼都會(huì)被插入到程序中。除了非常
小的宏之外,程序的長(zhǎng)度會(huì)大幅度增長(zhǎng)
|
函數(shù)代碼只出現(xiàn)于一個(gè)地方;每
次使用這個(gè)函數(shù)時(shí),都調(diào)用那個(gè)
地方的同一份代碼
|
執(zhí)
行
速
度
|
更快
|
存在函數(shù)的調(diào)用和返回的額外開 銷,所以相對(duì)慢一些
|
操
作
符
優(yōu)
先
級(jí)
|
宏參數(shù)的求值是在所有周圍表達(dá)式的上下文環(huán)境里,
除非加上括號(hào),否則鄰近操作符的優(yōu)先級(jí)可能會(huì)產(chǎn)生
不可預(yù)料的后果,所以建議宏在書寫的時(shí)候多些括
號(hào)。
|
函數(shù)參數(shù)只在函數(shù)調(diào)用的時(shí)候求
值一次,它的結(jié)果值傳遞給函
數(shù)。表達(dá)式的求值結(jié)果更容易預(yù)測(cè)
|
帶
有
副
作
用
的
參
數(shù)
|
參數(shù)可能被替換到宏體中的多個(gè)位置,所以帶有副作 用的參數(shù)求值可能會(huì)產(chǎn)生不可預(yù)料
的結(jié)果
|
函數(shù)參數(shù)只在傳參的時(shí)候求值一次,結(jié)果更容易控制。
|
參
數(shù)
類
型
|
宏的參數(shù)與類型無(wú)關(guān),只要對(duì)參數(shù)的操作是合法的, 它就可以使用于任何參數(shù)類型。
|
函數(shù)的參數(shù)是與類型有關(guān)的,如果參數(shù)的類型不同,就需要不同的函數(shù),即使他們執(zhí)行的任務(wù)是相同的。
|
調(diào)
試
|
宏是不方便調(diào)試的
|
函數(shù)是可以逐語(yǔ)句調(diào)試的
|
遞
歸
|
宏是不能遞歸的
|
函數(shù)是可以遞歸的
|
把宏名全部大寫函數(shù)名不要全部大寫
3#undef
#undef NAME// 如果現(xiàn)存的一個(gè)名字需要被重新定義,那么它的舊名字首先要被移除。
?
4 命令行定義
#include <stdio.h>
int main()
{
? ?int array [ARRAY_SIZE];
? ?int i = 0;
? ?for(i = 0; i< ARRAY_SIZE; i ++)
? {
? ? ? ?array[i] = i;
? }
? ?for(i = 0; i< ARRAY_SIZE; i ++)
? {
? ? ? ?printf("%d " ,array[i]);
? }
? ?printf("\n" );
? ?return 0;
}
//linux 環(huán)境演示
gcc -D ARRAY_SIZE=10 programe.c
5 條件編譯
比如說(shuō):
?------------------------------條件編譯的“條件”不可以是變量------------------------------------------------
因?yàn)闂l件編譯中的條件在預(yù)處理階段就已經(jīng)處理了,而預(yù)處理階段不處理變量
?使用方法再舉例
?關(guān)系可以向C語(yǔ)言中的“if.....else”語(yǔ)句考慮
更多例子
?
6 文件包含
?這個(gè)多次包含編譯器是不會(huì)進(jìn)行報(bào)錯(cuò)的,但是這個(gè)東西意味著程序?qū)⒍啻握{(diào)用同一段代碼
這顯然是多余的,ok,看起來(lái)似乎這個(gè)多次包含同一文件的錯(cuò)誤對(duì)于個(gè)人來(lái)講很容易規(guī)避
但是如果是
?下圖這般
?如何避免呢?
答:條件編譯
?下面這個(gè)放在第一行也具有相同作用
#pragma once//這個(gè)也是OK的
?#include <filename.h> 和 #include "filename.h"有什么區(qū)別?
答:如果使用尖括號(hào),那么程序?qū)⒅苯釉谙到y(tǒng)頭文件庫(kù)尋找該文件
如果使用引號(hào),那么程序?qū)F(xiàn)在本地找一找,找不到才回去系統(tǒng)頭文件庫(kù)查找
從提升效率的角度講,系統(tǒng)頭文件調(diào)用時(shí)應(yīng)該使用<>
而個(gè)人創(chuàng)建的頭文件,應(yīng)該使用“”
?
總結(jié)
提示:這里對(duì)文章進(jìn)行總結(jié):
例如:以上就是今天要講的內(nèi)容,本文僅僅簡(jiǎn)單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-796987.html
到了這里,關(guān)于【C語(yǔ)言】程序環(huán)境和預(yù)處理|預(yù)處理詳解|定義宏(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!