真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語(yǔ)言中宏替換函數(shù) c語(yǔ)言中宏替換怎么算

C語(yǔ)言中宏替換占不占用運(yùn)行時(shí)間

1.

創(chuàng)新互聯(lián)專注于企業(yè)成都營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、易縣網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為易縣等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

宏替換不占用運(yùn)行時(shí)間。宏替換是在編譯時(shí),編譯器完成的。占用編譯時(shí)間。

2.

編譯時(shí),編譯器會(huì)將代碼中的宏用對(duì)應(yīng)定義好的代碼進(jìn)行直接替換,然后再對(duì)源代碼進(jìn)行編譯。

3.

所以宏比函數(shù)在運(yùn)行時(shí)更快,因?yàn)樗挥孟窈瘮?shù)調(diào)用時(shí),要對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行入棧保存,運(yùn)行完后,在出?;謴?fù);它是直接編譯好的代碼。

C語(yǔ)言 define 帶參數(shù)的宏替換

樓主 來(lái)看看 gcc 預(yù)處理命令得到的結(jié)果吧 ? ?結(jié)果是 把整型3 強(qiáng)制轉(zhuǎn)換為 void 類型的 一個(gè)表達(dá)式

把3 去掉編譯就報(bào)錯(cuò)了

求c語(yǔ)言中宏常量和宏替換的異同點(diǎn)

它們本質(zhì)是一樣的,都是將 #define 之后的內(nèi)容用另一段內(nèi)容替代而已,唯一的區(qū)別就是宏常量通常是數(shù)字,而宏替換可以變得很復(fù)雜。這個(gè)就好像一個(gè)函數(shù),f(x)=x,這樣寫(xiě)的話很簡(jiǎn)單,但是 x 也可以是很復(fù)雜的東西,例如 f(x^3)=x^3,這兩個(gè)函數(shù)都是 f,唯一的區(qū)別就是自變量的表示不一樣而已。而宏替換也是如此,我們可以給 x 一個(gè)很簡(jiǎn)單的數(shù)字,也可以給它一個(gè)字符串,也可以給它一個(gè)很復(fù)雜的表達(dá)式,但是最終的效果都是將我們的宏定義替換一下。

C語(yǔ)言:(1)宏替換有數(shù)據(jù)類型的限制嗎?(2)宏調(diào)用筆函數(shù)調(diào)用耗費(fèi)時(shí)間嗎?

(1)沒(méi)有類型限制,宏替換只是單純代碼文本的替換,不會(huì)檢測(cè)類型。

(2)所謂“宏調(diào)用”實(shí)際上是在編譯階段將代碼替換,在編譯完成之后,程序執(zhí)行時(shí),不存在宏調(diào)用的步驟,函數(shù)調(diào)用是在程序執(zhí)行時(shí)實(shí)際調(diào)用的,兩者沒(méi)有可比性。

C語(yǔ)言宏替換

應(yīng)該看C語(yǔ)言教材書(shū)上的內(nèi)容,那里講的會(huì)比較詳細(xì).

宏替換就是文本替換,注意以下程序段:

#include stdio.h

#define MAX 5

int main(void)

{

int a[MAX];

int i;

for (i=0;iMAX;i++) scanf("%d",a[i]);

return 0;

}

這個(gè)程序定義了一個(gè)自定義宏MAX,它的替換文字是5,在程序開(kāi)始編譯之前,馳處理器會(huì)完成宏替換的操作,將這個(gè)程序文件中的所以MAX都替換成5,然后編譯器再執(zhí)行編譯.

C語(yǔ)言中,宏替換的替換規(guī)則

簡(jiǎn)單來(lái)說(shuō):宏定義又稱為宏代換、宏替換,簡(jiǎn)稱“宏”。宏替換是C/C++的預(yù)處理中的一部分,在C++標(biāo)準(zhǔn)中有4條規(guī)則來(lái)定義替換。

規(guī)則1:實(shí)參替換。

本條規(guī)則描述帶參數(shù)的宏的替換過(guò)程。

對(duì)于宏定義中的形參,在替換列表中,如果不是作為#或##的操作數(shù),那么將對(duì)應(yīng)實(shí)參完全

展開(kāi)(相當(dāng)于對(duì)實(shí)參進(jìn)行求值),然后將替換列表中的形參替換掉.如果是#或##的操作數(shù),

那么不進(jìn)行替換。

規(guī)則2:多次掃描。

在所有的形參替換為實(shí)參后,對(duì)結(jié)果進(jìn)行再次掃描,如果發(fā)現(xiàn)還有可替換的宏,則進(jìn)行替換,

否則中止。

規(guī)則3:遞歸替換抑制。

如果在替換列表中發(fā)現(xiàn)當(dāng)前正在展開(kāi)的宏的名字,那么這里不進(jìn)行替換.更進(jìn)一步,在嵌套

的替換過(guò)程中發(fā)現(xiàn)已經(jīng)替換過(guò)的宏的名字,則不進(jìn)行替換。

規(guī)則4:遞歸預(yù)處理抑制。

如果替換后的結(jié)果形成預(yù)處理指令,則不執(zhí)行這條預(yù)處理指令。

看幾個(gè)C++標(biāo)準(zhǔn)中的例子:

#define x 3

#define f(a) f(x * (a))

#undef x

#define x 2

#define g f

#define z z[0]

#define h g(~

#define m(a) a(w)

#define w 0,1

#define t(a) a

f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);

g(x+(3,4)-w) | h 5) m(f)^m(m);

其結(jié)果分別是

f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);

f(2 * (2+(3,4)-0,1)) | f(2 * ( ~ 5)) f(2 * (0,1))^m(0,1);

對(duì)于第一個(gè),主要在于t(t(g)(0) + t)(1)的展開(kāi)。

容易計(jì)算出最外層的t的實(shí)參是f(2 * (0)) + t,而作為t的參數(shù)傳入時(shí)其中的t是

正在被展開(kāi)的宏,所以根據(jù)規(guī)則3,不對(duì)這個(gè)t進(jìn)行處理,保持不變,得到f(2 * (0)) + t(1)。

對(duì)于第二個(gè),h 5)被替換為g(~5),應(yīng)用規(guī)則2,被替換為f(2 * ( ~ 5))。

而m(m)首先被替換為m(w),然后應(yīng)用規(guī)則2再次進(jìn)行替換,但是m已經(jīng)是替換過(guò)的了,所以保持

不變,只對(duì)w進(jìn)行替換。

#define str(s) # s

#define xstr(s) str(s)

#define debug(s, t) printf("x" # s "= %d, x" # t "= %s", \

x ## s, x ## t)

#define INCFILE(n) vers ## n /* from previous #include example */

#define glue(a, b) a ## b

#define xglue(a, b) glue(a, b)

#define HIGHLOW "hello"

#define LOW LOW ", world"

debug(1, 2);

fputs(str(strncmp("abc\0d", "abc", ’\4’) /* this goes away */

== 0) str(: @\n), s);

#include xstr(INCFILE(2).h)

glue(HIGH, LOW);

xglue(HIGH, LOW)

其結(jié)果分別是

printf("x" "1" "= %d, x" "2" "= %s", x1, x2);

fputs("strncmp(\"abc\\0d\", \"abc\", ’\\4’) = = 0" ": @\n", s);

#include "vers2.h"

"hello";

"hello" ", world"

關(guān)鍵是glue和xglue.

對(duì)于glue(HIGH, LOW),首先有一個(gè)規(guī)則1的抑制,得到HIGHLOW;的結(jié)果,然后二次掃描,得到

"hello";

對(duì)于xglue(HIGH, LOW)沒(méi)有抑制效果,所以對(duì)參數(shù)求值,分別得到HIGH和LOW ", world",即

glue(HIGH, LOW ", world")。

然后進(jìn)行連接操作得到HIGHLOW ", world",最后再掃描一次得到"hello" ", world"

如果考慮字符串的自然的連接,就可以得到"hello, world"了。

擴(kuò)展資料

宏語(yǔ)言是一類編程語(yǔ)言,其全部或多數(shù)計(jì)算是由擴(kuò)展宏完成的。宏語(yǔ)言并未在通用編程中廣泛使用,但在文本處理程序中應(yīng)用普遍。例如, C preprocessor C預(yù)處理器Internet Macros(iOpus) M4(如前所述,源于ATT,捆綁于Unix)

宏定義

c程序提供的預(yù)處理功能之一。包括帶參數(shù)的宏定義和不帶參數(shù)的宏定義。具體是指用一個(gè)指定的標(biāo)志符來(lái)進(jìn)行簡(jiǎn)單的字符串替換或者進(jìn)行闡述替換。形式為:

#define標(biāo)志符[(參數(shù)表)] 字符串

宏名

在上定義中的標(biāo)志符被稱為“宏名”。

宏展開(kāi)

在c程序編譯時(shí)將宏名替換成字符串的過(guò)程稱為“宏展開(kāi)”。

宏語(yǔ)言是一類編程語(yǔ)言,其全部或多數(shù)計(jì)算是由擴(kuò)展宏完成的。宏語(yǔ)言并未在通用編程中廣泛使用, 但在文本處理程序中應(yīng)用普遍。例如,

C preprocessorC 預(yù)處理器

Internet Macros(iOpus)

M4(如前所述,源于ATT,捆綁于Unix)

參考資料來(lái)源:百度百科-宏


文章標(biāo)題:c語(yǔ)言中宏替換函數(shù) c語(yǔ)言中宏替換怎么算
本文地址:http://weahome.cn/article/hjjsoh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部