欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

c語言宏替換兩個函數(shù)名 c語言中的宏替換是什么意思

c語言中如果定義了一個函數(shù),那么用宏定義可以替換名稱嗎

會出錯吧,宏定義替換的是一個常數(shù),如果是用宏來計算什么的話,也是將函數(shù)過程給放上去,得出值后被宏名替換,直接替換函數(shù)名是不可行的

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、青云譜ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的青云譜網(wǎng)站制作公司

c語言宏替換

定義宏是,一般建議用括號括起來。我們來看兩個例子:

例子一:

#define?N?m?+?1

如果代碼里面我們寫

N?*?N

想象看會變成什么

m?+?1?*?m?+?1

也就是 1 + 2 * m 這可能不是你需要的。

例子二 : 如果我們用括號括起來

#define?N?(?m?+?1?)

同樣的

N?*?N

這時候會替換 成

(?m?+?1?)?*?(?m?+?1?)

這樣的結(jié)果才是對的。

回過頭來看看你的代碼, 你 需要 把 宏 括起來

#include?iostream.h

#define?N?(2)???//?這里括起來不括起來沒區(qū)別;但?如果你寫成?#define?N?1?+?1?就可能造成區(qū)別的,所以一般宏定義建議加個括號。

#define?M?(N+1)

#define?NUM?(2?*?M?+?1)

int?main()?{?

for(int?i=1;?i=NUM;?++i)?

cout??i;

}

C語言宏替換

應(yīng)該看C語言教材書上的內(nèi)容,那里講的會比較詳細(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;

}

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

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

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

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

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

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

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

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

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

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

否則中止。

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

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

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

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

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

看幾個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);

對于第一個,主要在于t(t(g)(0) + t)(1)的展開。

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

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

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

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

不變,只對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.

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

"hello";

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

glue(HIGH, LOW ", world")。

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

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

擴(kuò)展資料

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

宏定義

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

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

宏名

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

宏展開

在c程序編譯時將宏名替換成字符串的過程稱為“宏展開”。

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

C preprocessorC 預(yù)處理器

Internet Macros(iOpus)

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

參考資料來源:百度百科-宏

c語言宏的使用問題

這個宏定義一個函數(shù) S(r) ,其中 :

函數(shù)名:S

參數(shù):r

函數(shù)內(nèi)容: r*r

使用 S(a+b) , 就是把函數(shù) S(r) 的函數(shù)內(nèi)容中的參數(shù) r, 用 a+b 替換,得到:a+b*a+b 。

因此, area=S(a+b) = a+b*a+b 。

其實這個例子是用來說明宏定義容易【出錯的】!函數(shù) S 的本來目的是用來求平方的,

現(xiàn)在達(dá)不到預(yù)期的目的。正確的宏定義是:

#define S(r) (r)*(r)

網(wǎng)站名稱:c語言宏替換兩個函數(shù)名 c語言中的宏替換是什么意思
本文路徑:http://chinadenli.net/article0/dooghio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作網(wǎng)站導(dǎo)航移動網(wǎng)站建設(shè)網(wǎng)站改版面包屑導(dǎo)航全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)