會出錯吧,宏定義替換的是一個常數(shù),如果是用宏來計算什么的話,也是將函數(shù)過程給放上去,得出值后被宏名替換,直接替換函數(shù)名是不可行的
我們提供的服務有:成都網站設計、成都做網站、微信公眾號開發(fā)、網站優(yōu)化、網站認證、青云譜ssl等。為上1000+企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的青云譜網站制作公司
定義宏是,一般建議用括號括起來。我們來看兩個例子:
例子一:
#define?N?m?+?1
如果代碼里面我們寫
N?*?N
想象看會變成什么
m?+?1?*?m?+?1
也就是 1 + 2 * m 這可能不是你需要的。
例子二 : 如果我們用括號括起來
#define?N?(?m?+?1?)
同樣的
N?*?N
這時候會替換 成
(?m?+?1?)?*?(?m?+?1?)
這樣的結果才是對的。
回過頭來看看你的代碼, 你 需要 把 宏 括起來
#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語言教材書上的內容,那里講的會比較詳細.
宏替換就是文本替換,注意以下程序段:
#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/C++的預處理中的一部分,在C++標準中有4條規(guī)則來定義替換。
規(guī)則1:實參替換。
本條規(guī)則描述帶參數(shù)的宏的替換過程。
對于宏定義中的形參,在替換列表中,如果不是作為#或##的操作數(shù),那么將對應實參完全
展開(相當于對實參進行求值),然后將替換列表中的形參替換掉.如果是#或##的操作數(shù),
那么不進行替換。
規(guī)則2:多次掃描。
在所有的形參替換為實參后,對結果進行再次掃描,如果發(fā)現(xiàn)還有可替換的宏,則進行替換,
否則中止。
規(guī)則3:遞歸替換抑制。
如果在替換列表中發(fā)現(xiàn)當前正在展開的宏的名字,那么這里不進行替換.更進一步,在嵌套
的替換過程中發(fā)現(xiàn)已經替換過的宏的名字,則不進行替換。
規(guī)則4:遞歸預處理抑制。
如果替換后的結果形成預處理指令,則不執(zhí)行這條預處理指令。
看幾個C++標準中的例子:
#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);
其結果分別是
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是
正在被展開的宏,所以根據規(guī)則3,不對這個t進行處理,保持不變,得到f(2 * (0)) + t(1)。
對于第二個,h 5)被替換為g(~5),應用規(guī)則2,被替換為f(2 * ( ~ 5))。
而m(m)首先被替換為m(w),然后應用規(guī)則2再次進行替換,但是m已經是替換過的了,所以保持
不變,只對w進行替換。
#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)
其結果分別是
printf("x" "1" "= %d, x" "2" "= %s", x1, x2);
fputs("strncmp(\"abc\\0d\", \"abc\", ’\\4’) = = 0" ": @\n", s);
#include "vers2.h"
"hello";
"hello" ", world"
關鍵是glue和xglue.
對于glue(HIGH, LOW),首先有一個規(guī)則1的抑制,得到HIGHLOW;的結果,然后二次掃描,得到
"hello";
對于xglue(HIGH, LOW)沒有抑制效果,所以對參數(shù)求值,分別得到HIGH和LOW ", world",即
glue(HIGH, LOW ", world")。
然后進行連接操作得到HIGHLOW ", world",最后再掃描一次得到"hello" ", world"
如果考慮字符串的自然的連接,就可以得到"hello, world"了。
擴展資料
宏語言是一類編程語言,其全部或多數(shù)計算是由擴展宏完成的。宏語言并未在通用編程中廣泛使用,但在文本處理程序中應用普遍。例如, C preprocessor C預處理器Internet Macros(iOpus) M4(如前所述,源于ATT,捆綁于Unix)
宏定義
c程序提供的預處理功能之一。包括帶參數(shù)的宏定義和不帶參數(shù)的宏定義。具體是指用一個指定的標志符來進行簡單的字符串替換或者進行闡述替換。形式為:
#define標志符[(參數(shù)表)] 字符串
宏名
在上定義中的標志符被稱為“宏名”。
宏展開
在c程序編譯時將宏名替換成字符串的過程稱為“宏展開”。
宏語言是一類編程語言,其全部或多數(shù)計算是由擴展宏完成的。宏語言并未在通用編程中廣泛使用, 但在文本處理程序中應用普遍。例如,
C preprocessorC 預處理器
Internet Macros(iOpus)
M4(如前所述,源于ATT,捆綁于Unix)
參考資料來源:百度百科-宏
這個宏定義一個函數(shù) S(r) ,其中 :
函數(shù)名:S
參數(shù):r
函數(shù)內容: r*r
使用 S(a+b) , 就是把函數(shù) S(r) 的函數(shù)內容中的參數(shù) r, 用 a+b 替換,得到:a+b*a+b 。
因此, area=S(a+b) = a+b*a+b 。
其實這個例子是用來說明宏定義容易【出錯的】!函數(shù) S 的本來目的是用來求平方的,
現(xiàn)在達不到預期的目的。正確的宏定義是:
#define S(r) (r)*(r)
網站名稱:c語言宏替換兩個函數(shù)名 c語言中的宏替換是什么意思
本文路徑:http://www.chinadenli.net/article0/dooghio.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網站制作、網站導航、移動網站建設、網站改版、面包屑導航、全網營銷推廣
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)