① 小說《哈利波特》最後的結局
第七部最後講述經過和伏地魔的大戰,生還者19年後送孩子上霍格沃茲魔法學校再重逢的場景。令人高興的是,「魔法三人組」哈利、羅恩和赫敏無一人死去,羅恩和赫敏還結婚生下了兩個孩子羅斯和雨果,羅恩甚至用魔法作弊混過了麻瓜的駕照考試。最讓人意外的是哈利竟然和金妮結婚了,他們的三個孩子為了紀念哈利的父母和在上集逝去的鄧不利多校長,而分別取名為詹姆斯、莉莉和阿爾布思(鄧不利多的教名)。
而之前羅林預告的兩名壯烈犧牲的主角竟是斯內普教授和貓頭鷹海德薇。另外,哈利小兒子的全名叫做阿爾布思·西弗勒斯·波特,除了紀念鄧不利多,其中的「西弗勒斯」更是斯內普教授的教名。看來一向角色陰暗的斯內普其實是真正的好人。
在曝光的內容中,全書最後一句話是「The scar has not pained Harry for nineteen years. All was well.(那道傷疤19年來再也沒讓哈里疼過。一切都很好。)」顯然這是作者為書中人物定下的最終命運。
哈利也是魂器。不過,伏地魔用哈利的血復活了自己,卻不知哈利的血中有當年他媽媽為保護他留下的血咒,所以伏地魔不死,血咒不會消失,哈利也不會死。而第六集中鄧不利多被斯內普殺死的情節,原是他跟斯內普作的「卧底計劃」,其實斯內普深愛哈利的母親,最終他被伏地魔的大蛇咬死。在決戰中,伏地魔的大蛇死於納威的劍下,扭轉了戰局。
和網上前些天泄漏的一樣。
最後一章的翻譯:
今年的秋天好像突然間就降臨了。九月第一天的早晨像蘋果般乾脆、金黃,汽車道的尾氣與行人的呼吸在清涼的空氣中像蜘蛛絲似地閃耀著,小一家幾口走過隆隆聲的街道向著那個大大的黑熏熏的車站走去。由兩個家長推著的負載的手推車頂上有兩個大大的籠子,裡面的貓頭鷹們憤怒地叫著,一個紅頭發的女孩無精打采地跟著兩兄弟後面,抓住她爸爸的手臂。
「不會太久了,你也很快就去了。」哈利告訴她。
「兩年呢!」莉莉輕蔑地說,「我現在就想去。」
過路的人好奇地盯著那貓頭鷹,因為那家人徘徊在它向著9號與10號月台之間的檢票口。阿不思的聲音從周圍的喧囂中傳到了哈利耳中,他的兒子們又重新開始了剛開車時的那場爭吵。
「我不會的!我不會去斯萊特林的!」
「詹姆,讓他歇一會吧!」金妮說道。
「我只說他可能會,」詹姆說,對他的弟弟露齒一笑,「那沒錯啊。他可能去斯萊——」
但詹姆捕捉到他媽媽的眼神,靜了下來。波特五口子走近了檢票口,詹姆越過肩膀自大地微微看了他弟弟一眼,開始跑起來。片刻後,他消失了。
「你們會寫信給我的,是嗎?」阿不思利用他哥哥不在的一點時間,立即問他父母。
「如果你想我們這樣做的話,每天,」金妮說。
「不要每天,」阿不思飛快地說,「詹姆說大多數人都是一個月收到一封家裡的信。」
「我們去年一個星期寫三封信給他。」金妮說道。
「你也不願相信詹姆告訴你有關霍格沃茨的所有事,」哈利咕噥道,「你哥,他像個笑柄。」
他們肩並肩地把第二個手推車集中加速推向前。當他們到檢票口時,阿不思退縮了,但他沒有撞上。反而,他們一家子出現在被猩紅色的霍格沃茨特快噴出的蒸汽所籠罩的九又四分之三月台。模糊不清的人群透過薄霧蜂擁著,詹姆早已消失在薄霧中。
「他們在哪?」阿不思焦慮地說,沿著月台摸索著路,凝視著那些模糊不清的形狀。
「我們會找到他們的,」金妮放心地說。
但是霧太濃了,很難辨認出人們的臉孔。嗓音離開它們的主人後,聲音大得很不自然。哈利覺得自己聽到珀西在大聲地演講著關於飛天掃帚的規范使用,那是一個很好的理由不去跟他打招呼…
「我想那就是他們了,阿不思。」金妮突然說。
薄霧中出現了四個人,他們站在最後一截車廂旁。當哈利、金妮、阿不思和莉莉追上他們時,他們的臉才顯得更明顯。
「嗨!」阿不思說道,聽起來像被無限釋放了。
早就穿好嶄新的霍格沃茨校服的Rose愉快地看著他。
「泊好車了?」羅恩問哈利,「我做到了!赫敏怎麼也不相信我通過了麻瓜的駕駛測試,是嗎?她還以為我要向考試官施混淆咒。」
「沒,才沒這會事,」赫敏說,「我對你有完全的信任。」
「實際上嘛,我的確對他施了混淆咒。」羅恩向哈利小聲說道,他們一起把阿不思的行李和貓頭鷹抬到火車上。「我只是忘記看倒後鏡,讓他看到了。我會為此用超級記憶咒的。」
在月台後面,他們找到了莉莉和Rose的弟弟Hugo,他們熱情地討論著將來到霍格沃茨後分到什麼學院。
「要是你們不在格蘭芬多的話,我們就會剝奪你們的繼承權,」羅恩說道,「可沒強迫你們。」
「羅恩!」
莉莉和Hugo笑了,但阿不思和Rose看上去很孤獨。
「他不是那個意思,」赫敏和金妮說道,但羅恩已經不注意她們了。捕捉到哈利的眼神,他邊點頭邊轉到了大約150英尺以外的地方。有那麼一會兒,蒸汽變薄了,看見三個人站在變幻的薄霧中。
「看那是誰。」
德拉科.馬爾福與他的妻兒站在那裡,黑色的外衣扣緊了他喉嚨,它的頭發有些禿,突出了它的下顎。有個新來的男孩長得像德拉科,就像阿不思長得像哈利一樣。德拉科瞥見哈利、羅恩、赫敏和金妮正盯著他,草率地點了點頭,轉身又走了。
「那就是說,那是小Scorpius了。」羅恩屏住呼吸說。「保證你每次考試都考得好過他,Rosie,謝天謝地你遺傳了你媽媽的腦子。」
「羅恩,看在老天的份上,」赫敏帶著半高興半嚴肅的語氣說,「別試著讓他們還沒上學就成死對頭。」
「你說的對,抱歉,」羅恩說,但又不由自主地加了一句,「盡管這樣,也不要跟他太老友,Rosie,要是你嫁給了一個純血統,你的韋斯萊爺爺可不會原諒你。」
「嘿!」
詹姆又重新出現了,把行李、貓頭鷹、手推車卸下了,看他的樣子顯然剛被新聞轟炸完。
「泰迪已經回來了,」他喘不過氣地說,從肩膀後指著滾滾的蒸汽,「剛剛看見他了。你猜他干什麼來著?他和Victoire在接吻!」
他凝視著大人們,對他們的沒反應表示失望。
「我們的泰迪!泰迪.盧平!與我們的Victoire接吻!我們的表姐!然後我就問泰迪他在干什麼——」
「你打擾他們?」金妮說道,「你可真像羅恩——」
「——然後他說他是來送她的!然後他叫我走開。他在和她接吻!」詹姆又加上這么一句,他著急著好像他說得不夠清楚。
「噢,要是他們結婚了,那就太可愛了!」莉莉心醉地說,「泰迪就真的變成我們家的一部分了。」
「他已經每個星期來吃四次飯了,」哈利說,「我們為什麼不把他留在我們家和我們住呢?」
「耶!」詹姆狂熱地說,「我不介意與阿——泰迪會要了我的房間?」
「不,」哈利堅定地說,「如果我想把我的房子給毀了的話,才讓你和阿不思睡同一間房。」
他看了看曾經屬於Fabian Prewett的碎老表。
「快11點了,你最好快點上車。」
「別忘了把我們的『愛』帶給納威。」金妮擁抱詹姆時說。
「媽!我不能給『愛』給一個教授!」
「但是你認識納威——」
詹姆翻了翻眼睛。
「在外面,對啊。但在霍格沃茨,他還是隆巴頓教授。我不能跟他講著講著草葯學就給個『愛』給他吧?」
他對她媽媽的愚笨搖了搖頭,瞄準阿不思提了一腳,以發泄自己的情緒。
「回頭見,阿不思。要小心夜騏。」
「我還以為他們是隱形的?你說它們是隱形的!」
但詹姆只是笑了笑,容許他媽媽吻了一口,給了他父親一個短暫的擁抱,然後縱身一躍,跳進了裝的慢慢的火車。他們看見他揮揮手,飛快地跑進了走廊去找他的朋友了。
金妮吻別了阿不思。
「聖誕節見了。」
「再見,阿不思,」兒子抱著哈利,哈利說,「別忘了下星期五海格邀請了你去喝茶。不要和皮皮鬼糾纏。還沒學會就不要與別人決斗。也不要讓詹姆使你感到緊張。」
「要是我分到斯萊特林怎麼辦?」
這細語是給他父親聽的,哈利知道只有在離別的瞬間才能強迫阿不思發現當初那種恐懼之大和真誠。哈利蹲下來,好讓阿不思正對著他。哈利的三個孩子里,只有阿不思遺傳了莉莉的眼睛。
「阿不思.西弗勒斯,」哈利靜靜地說,好讓除了金妮以外的任何人聽不見,她也夠聰明,裝著跟車上的Rose揮手,「你是以霍格沃茨的兩位校長來起名字的。他們其中一個就是斯萊特林的,它可能是我認識的人中最勇敢的了。」
「但你剛才說——」
「——然後斯萊特林學院會招收一個很棒的學生,不是嗎?那對我們沒什麼關系。但是如果你真的很介意,你可以選擇去格蘭芬多而不去斯萊特林。分院帽會把你的選擇計算在內的。」
「真的嗎?」
「它對我那樣做了。」哈利說道。
他從來未告訴過他任何一個孩子這件事, 他也看到了阿不思臉上露出的驚奇。但現在猩紅色的火車上的門響起了警鍾,看見人群向前最後一吻和最後一分鍾的提醒人模糊的紅色輪廓。阿不思跳進了車廂,金妮把她身後的門關上了。學生們也像吊在最近的窗戶上。一大群人的臉,包括車上和外面的,都轉向了哈利。
「為什麼他們都在盯著他看?」阿不思向Rose詢問道,他們轉過頭來看其他學生。
「別讓它使你擔心了,」羅恩說,「那是我!我是多麼的出名!」
阿不思, Rose,Hugo,和莉莉笑了。火車開始啟動了,哈利正在它旁邊走著,看著他兒子瘦瘦的臉早已閃耀著興奮。
哈利繼續笑著揮著手,盡管這有點像是喪失了親人。看著他的兒子從他身邊離開…
最後一縷蒸汽的痕跡消失了,火車也轉彎了。
「他會沒事的!」金妮咕噥道。
哈利看著她,茫然地低下頭,按住額頭上閃電形的傷疤。
「我知道他會。」
19年來,哈利的傷疤再也沒疼過。一切都顯得平常。
② 求哈7簡介
一開始,斯內普和YAXLEY出現,伏地魔 出場殺掉了霍格沃茨的MUGGLE STUDY老師CHARITY BURBAGE。
哈利在家從預言家日報中麗塔斯基特筆下了解到了鄧布利多的童年以及其弟阿布福斯和他的朋友兼敵人格林沃德的故事
哈利 被鳳凰社人接走,鳳凰社採納了蒙頓格斯弗萊徹的建議,用復方湯劑變出了六個假哈利,不料計劃泄露,
在空中哈里與伏地魔 第一次交手,喬治被斯內普切掉一隻耳朵, 瘋眼漢穆迪被伏地魔殺掉。哈利的貓頭鷹海德薇也死了。
哈利 與羅恩赫敏會合,參加完比爾和芙蓉的婚禮(維克多克魯姆也來了)後,開始走上摧毀魂器的道路。
魔法部長來訪,送給三人組鄧布利多的遺物。哈利得到了格里芬多的寶劍。
在老宅哈利改變對克里切的態度,得到了RAB的真實身份就是小天狼星的哥哥雷古勒斯布萊克的消息,而真的魂器斯萊特林
的掛墜盒被送進魔法部。
此時的魔法部在魯弗斯斯克林傑被殺後,由伏地魔接管,霍格沃茨也被其控制。三人組通過復方湯劑混入魔法部,搶走了魂器。
之後羅恩與哈利 鬧翻,魔杖折斷無法使用,敵人出現,而在關鍵時刻,一個人發出了守護神咒,出現了一隻DOE救了他。而小天狼星給的雙面鏡派上了用場,哈利從中看見了一隻眼睛。
鏡中人救了他們
三人組重歸於好後,拜訪了盧娜的老爹XENOPHILIUS LOVEGOOD,了解了一個千年以來被人當作童話的真實東西,三件死亡的聖物(DEATHLY HALLOWS)。
1,THE ELDER WAND,最強大的魔杖。
2,THE RESSURECTION STONE,能夠起死回生的石頭。
3,INVISIBILITY CLOAK,能夠隱身的斗篷。
三人組到了戈德里克山谷 拜訪了哈利 的故居和父母的墳墓,發現INVISIBILITY CLOAK就是哈利父親詹姆斯從遠古繼承下來傳給他的。
之後三人遇見了其餘幾個失散的夥伴,從一個妖精口中得知在貝拉特里克斯 蘭斯特蘭傑的古靈閣銀行的保險箱里有另一個魂器。
哈利 和他做了一筆交易後,用復方湯劑潛入了馬爾福的庄園,一番激戰後,救出了另一隻妖精和魔杖製造師奧利凡德,
搶走了德拉科馬爾福和貝拉特里克斯 蘭斯特蘭傑的魔杖。多比和小矮星彼得犧牲。
(其中多比死後,哈利在他墓碑上寫下的花最讓人感動:HERE LIES DOBBY,A FREE ELF)
哈利從奧利凡德嘴中知道了THE ELDER WAND的秘密,三人組潛入重兵封鎖下的霍格沃茨,納威,麥格 阿布福斯 鄧布利多相繼出現,
GREY LADY和BLOODY BARON揭開了拉文克勞的遺物,即又一個魂器的秘密。三人組摧毀了RAVENCLAW DIADEM和HUFFLEPUFF CUP。
加上之前的里德爾的日記本和 斯萊特林的掛墜盒,伏地魔只剩下兩個魂器。
伏地魔 率大軍壓境,哈利三人組與 馬爾福三人組狹路相逢,戰斗後克拉布死去,霍格沃茨發生爆炸,弗雷德犧牲。
決戰開始前,伏地魔得知了THE ELDER WAND的秘密:
這支魔杖必須由新任主人殺死或擊敗前任主人才能發揮其強大威力,這支魔杖從GRINDELWALD到DUMBLDORE到斯內普幾經輾轉,伏地魔讓NAGINI殺死斯內普來取得
THE ELDER WAND最大力量,斯內普臨死前交給哈利他的記憶,並說出:LOOK AT ME的遺言,在哈利那一雙綠眼睛的注視下平靜地死去。
從冥想盆中哈利得知了斯內普與莉莉的往事,和鄧布利多 與 斯內普 的計劃,原來斯內普的一生都在為莉莉付出。
而一切的一切,最終目的是讓哈利死在 伏地魔杖下。
哈利 回到城堡外,大戰激烈,盧平,唐克斯,柯林克里維相繼死去。哈利在一旁用藏在鄧布利多交給他的遺物中發現的THE RESSURECTION STONE
召回了詹姆斯, 莉莉,小天狼星,盧平的靈魂(即不是本人肉體,也不是鬼魂)。
哈利 慷慨赴死,他的靈魂與鄧布利多相見,鄧布利多 也不算是DEFINETELY DIED,與伏地魔用殺戮的方法製造魂器不同,鄧布利多依靠的是DEATHLY HALLOWS。
暢談過後,哈利體內的伏地魔一部分靈魂徹底消失,而在納威殺死納吉尼之後,伏地魔只剩下了自己體內的靈魂。(HE IS MORTAL ONCE MORE!)
失去哈利的人慌作一團。伏地魔一挑三,大戰金斯利沙克布特,麥格,斯拉格霍恩。
貝拉特里克斯 蘭斯特蘭傑一挑三,大戰韋斯萊夫人,金妮,盧娜,在貝拉言語挑逗下,韋斯萊夫人 殺死了貝拉特里克斯 蘭斯特蘭傑。
盛怒之下的伏地魔向韋斯萊夫人發出AVADA KEDAVRA,復活後的哈利用PROTEGO 擋住了殺招。
決戰打響,哈利 告訴了斯內普是好人,而去年的謀殺是他與校長計劃好的計策。所以斯內普沒有繼承THE ELDER WAND的魔力,
而伏地魔雖然殺死了斯內普,也無法得到那根魔杖的魔力。真正的THE ELDER WAND的力量在哈利 從德拉科 馬爾福手中搶來的魔杖獲得。
伏地魔 被自己發出的AVADA KEDAVRA 擊中死去,天下太平。
十九年後,在9又3/4站台,哈利 與 金妮 的孩子詹姆斯波特,莉莉波特,阿爾不思西弗勒斯波特 和羅恩與赫敏的孩子雨果,羅斯見面,
德拉科 馬爾福 也帶著他的孩子SCORPIUS(小天蠍座馬爾福?) 到來。
全書完。
③ c語言中define的用法
C語言是計算機軟體領域非常經典的編程語言,unix、linux等眾多操作系統均是由C語言編寫而成。而在硬體控制、底層驅動等應用領域,C語言更是具有不可替代的作用。下面我就跟你們詳細介紹下c語言中define的用法,希望對你們有用。
c語言中define的用法如下:
#define是C語言中提供的宏定義命令,其主要目的是為程序員在編程時提供一定的方便,並能在一定程度上提高程序的運行效率,但學生在學習時往往不能 理解該命令的本質,總是在此處產生一些困惑,在編程時誤用該命令,使得程序的運行與預期的目的不一致,或者在讀別人寫的程序時,把運行結果理解錯誤,這對 C語言的學習很不利。
1. #define命令剖析
1.1 #define的概念
#define命令是C語言中的一個宏定義命令,它用來將一個標識符定義為一個字元串,該標識符被稱為宏名,被定義的字元串稱為替換文本。
該命令有兩種格式:一種是簡單的宏定義,另一種是帶參數的宏定義。
(1) 簡單的宏定義:
#define <宏名><字元串>
例: #define PI 3.1415926
(2) 帶參數的宏定義
#define <宏名> (<參數表>) <宏體>
例: #define A(x) x
一個標識符被宏定義後,該標識符便是一個宏名。這時,在程序中出現的是宏名,在該程序被編譯前,先將宏名用被定義的字元串替換,這稱為宏替換,替換後才進行編譯,宏替換是簡單的替換。
1.2 宏替換發生的時機
為了能夠真正理解#define的作用,讓我們來了解一下對C語言源程序的處理過程。當我們在一個集成的開發環境如Turbo C中將編寫好的源程序進行編譯時,實際經過了預處理、編譯、匯編和連接幾個過程,見圖1。
源程序預處理器修改後的源程序編譯器匯編程序匯編器可重定位的目標程序連接器可執行的目標程序圖1C語言的編譯過程
其中預處理器產生編譯器的輸出,它實現以下的功能:
(1) 文件包含
可以把源程序中的#include 擴展為文件正文,即把包含的.h文件找到並展開到#include 所在處。
(2) 條件編譯
預處理器根據#if和#ifdef等編譯命令及其後的條件,將源程序中的某部分包含進來或排除在外,通常把排除在外的語句轉換成空行。
(3) 宏展開
預處理器將源程序文件中出現的對宏的引用展開成相應的宏 定義,即本文所說的#define的功能,由預處理器來完成。
經過預處理器處理的源程序與之前的源程序有所有不同,在這個階段所進行的工作只是純粹的替換與展開,沒有任何計算功能,所以在學習#define命令時只要能真正理解這一點,這樣才不會對此命令引起誤解並誤用。
2#define使用中的常見問題解析
2.1 簡單宏定義使用中出現的問題
在簡單宏定義的使用中,當替換文本所表示的字元串為一個表達式時,容易引起誤解和誤用。如下例:
例1 #define N 2+2
void main()
{
int a=N*N;
printf(“%d”,a);
}
(1) 出現問題:在此程序中存在著宏定義命令,宏N代表的字元串是2+2,在程序中有對宏N的使用,一般同學在讀該程序時,容易產生的問題是先求解N為2+2=4,然後在程序中計算a時使用乘法,即N*N=4*4=16,其實該題的結果為8,為什麼結果有這么大的偏差?
(2)問題解析:如1節所述,宏展開是在預處理階段完成的,這個階段把替換文本只是看作一個字元串,並不會有任何的計算發生,在展開時是在宏N出現的地方 只是簡單地使用串2+2來代替N,並不會增添任何的符號,所以對該程序展開後的結果是a=2+2*2+2,計算後=8,這就是宏替換的實質,如何寫程序才 能完成結果為16的運算呢?
(3)解決辦法:將宏定義寫成如下形式
#define N (2+2)
這樣就可替換成(2+2)*(2+2)=16
2.2 帶參數的宏定義出現的問題
在帶參數的宏定義的使用中,極易引起誤解。例如我們需要做個宏替換能求任何數的平方,這就需要使用參數,以便在程序中用實際參數來替換宏定義中的參數。一般學生容易寫成如下形式:
#define area(x) x*x
這在使用中是很容易出現問題的,看如下的程序
void main()
{
int y=area(2+2);
printf(“%d”,y);
}
按理說給的參數是2+2,所得的結果應該為4*4=16,但是錯了,因為該程序的實際結果為8,仍然是沒能遵循純粹的簡單替換的規則,又是先計算再替換 了,在這道程序里,2+2即為area宏中的參數,應該由它來替換宏定義中的x,即替換成2+2*2+2=8了。那如果遵循(1)中的解決辦法,把2+2 括起來,即把宏體中的x括起來,是否可以呢?#define area(x) (x)*(x),對於area(2+2),替換為(2+2)*(2+2)=16,可以解決,但是對於area(2+2)/area(2+2)又會怎麼樣 呢,有的學生一看到這道題馬上給出結果,因為分子分母一樣,又錯了,還是忘了遵循先替換再計算的規則了,這道題替換後會變為 (2+2)*(2+2)/(2+2)*(2+2)即4*4/4*4按照乘除運算規則,結果為16/4*4=4*4=16,那應該怎麼呢?解決方法是在整個 宏體上再加一個括弧,即#define area(x) ((x)*(x)),不要覺得這沒必要,沒有它,是不行的。
要想能夠真正使用好宏定義,那麼在讀別人的程序時,一定要記住先將程序中對宏的使用全部替換成它所代表的字元串,不要自作主張地添加任何其他符號,完全展 開後再進行相應的計算,就不會寫錯運行結果。如果是自己編程使用宏替換,則在使用簡單宏定義時,當字元串中不只一個符號時,加上括弧表現出優先順序,如果是 帶參數的宏定義,則要給宏體中的每個參數加上括弧,並在整個宏體上再加一個括弧。看到這里,不禁要問,用宏定義這么麻煩,這么容易出錯,可不可以摒棄它, 那讓我們來看一下在C語言中用宏定義的好處吧。
3 宏定義的優點
(1) 方便程序的修改
使用簡單宏定義可用宏代替一個在程序中經常使用的常量,這樣在將該常量改變時,不用對整個程序進行修改,只修改宏定義的字元串即可,而且當常量比較長時, 我們可以用較短的有意義的標識符來寫程序,這樣更方便一些。我們所說的常量改變不是在程序運行期間改變,而是在編程期間的修改,舉一個大家比較熟悉的例 子,圓周率π是在數學上常用的一個值,有時我們會用3.14來表示,有時也會用3.1415926等,這要看計算所需要的精度,如果我們編制的一個程序中 要多次使用它,那麼需要確定一個數值,在本次運行中不改變,但也許後來發現程序所表現的精度有變化,需要改變它的值, 這就需要修改程序中所有的相關數值,這會給我們帶來一定的不便,但如果使用宏定義,使用一個標識符來代替,則在修改時只修改宏定義即可,還可以減少輸入 3.1415926這樣長的數值多次的情況,我們可以如此定義 #define pi 3.1415926,既減少了輸入又便於修改,何樂而不為呢?
(2) 提高程序的運行效率
使用帶參數的宏定義可完成函數調用的功能,又能減少系統開 銷,提高運行效率。正如C語言中所講,函數的使用可以使程序更加模塊化,便於組織,而且可重復利用,但在發生函數調用時,需要保留調用函數的現場,以便子 函數執行結束後能返回繼續執行,同樣在子函數執行完後要恢復調用函數的現場,這都需要一定的時間,如果子函數執行的操作比較多,這種轉換時間開銷可以忽 略,但如果子函數完成的功能比較少,甚至於只完成一點操作,如一個乘法語句的操作,則這部分轉換開銷就相對較大了,但使用帶參數的宏定義就不會出現這個問 題,因為它是在預處理階段即進行了宏展開,在執行時不需要轉換,即在當地執行。宏定義可完成簡單的操作,但復雜的操作還是要由函數調用來完成,而且宏定義 所佔用的目標代碼空間相對較大。所以在使用時要依據具體情況來決定是否使用宏定義。
形式參數不能用帶引號的字元串替換。
但是,如果在替換文本中,參數名以#作為前綴則結果將被擴展為 由 實際參數 替換 此實際參數的帶引號的字元串。
例如,可以將它與字元串連接運算結合起來編寫一個調試列印宏:
#define dprint(expr) printf(#expr “ = %\n”,expr)
使用語句 dprint(x/y);
調用宏時,該宏將被擴展為:printf(“x/y”“ = %\n”,x/y);
其中的字元串被連接起來了,這樣便等價於printf(“x/y = %\n”,x/y);
在實際參數中,每個雙引號 “ 將被替換為 \” ;反斜杠\將被替換為\\,因此替換後的字元串是合法的字元串常量。
預處理運算符 ## 為宏擴展提供了一種連接實際參數的手段。如果替換文本中的參數與 ## 相鄰,則該參數將被實際參數替換,##與前後的空白符將被刪除,並對替換後的結果重新掃描。
例如,下面定義的宏paste用於連接兩個參數
#define paste(front, back) front ## back
因此,宏調用past(name,1)的結果將建立記號name1.
c語言中沒有swap這個函數,C語言不支持重載,也沒有模版的概念,所以對於每一種類型,都要寫出相應的swap,如
intSwap (int *, int *);
longSwap (long *, long *);
stringSwap (char *, char *);
宏定義swap(t,x,y)以交換t類型的兩個參數(要使用程序塊結構)。
程序如下:
#include <iostream.h>
#define SWAP(t,x,y) \
{\
t temp = *y;\
*y = *x;\
*x = temp;\
}
main()
{
int a = 10, b = 5;
SWAP(int,&a,&b)
cout << a << endl << b<<endl;
}
用\換行,\的意思是說把下一行看作和這行是同一行.換行必須要反斜杠,而且\後面直接回車,不能有空格。
