成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

關(guān)于c語言宏定義的問題呢(c語言宏定義時要注意什么?)

c語言宏定義時要注意什么?定義的宏需要注意以下八點:1.預(yù)處理器直接用文本替換宏。2.宏中使用的參數(shù)將不會被評估和計算。3.預(yù)處理器不會檢查宏定義的語法,宏定義中的語法錯誤只能由編譯器檢測。4.宏定義

關(guān)于c語言宏定義的問題呢(c語言宏定義時要注意什么?)

c語言宏定義時要注意什么?

定義的宏需要注意以下八點:

1.預(yù)處理器直接用文本替換宏。

2.宏中使用的參數(shù)將不會被評估和計算。

3.預(yù)處理器不會檢查宏定義的語法,宏定義中的語法錯誤只能由編譯器檢測。

4.宏定義的效率高于函數(shù)調(diào)用(宏不占內(nèi)存,函數(shù)占內(nèi)存)。

5、宏的使用會帶來一些副作用。

6.#define定義的宏可以出現(xiàn)在程序的任何地方,而#define定義的代碼可以使用這個宏。

7.#define表達(dá)式的使用類似于函數(shù)調(diào)用,但宏比函數(shù)更強大,也更容易出錯。

8.遞歸定義不能出現(xiàn)在宏表達(dá)式中。

二、代碼測試(ubuntu10 gcc平臺)

C語言的宏定義用起來有什么要注意的?為什么很多宏用do{}while(0)包圍?

謝謝你。

C語言中的宏定義可以像函數(shù)一樣接收參數(shù)(這個宏定義通常被稱為 "函數(shù)式宏定義和),但它可以 不要像函數(shù)一樣提供參數(shù)的類型檢查,這對一些程序員來說是不安全的。

"函數(shù)式宏定義和在C語言中

然而,函數(shù)式宏定義并不。;t不在乎參數(shù)類型,有時候用來寫一些適用性更廣的C語言代碼,比如:

上面C語言的宏定義代碼實現(xiàn)了一個max()方法,該方法接收兩個參數(shù)并返回較大的一個。max()方法不支持。;t不關(guān)心參數(shù)的類型,所以__a和__b可以是int、char、double等數(shù)據(jù)類型。

如果max()方法提供的函數(shù)是用C語言函數(shù)的形式寫的,會有點麻煩,程序員要為每種數(shù)據(jù)類型實現(xiàn)一個max()函數(shù)。更糟糕的是,C語言不支持函數(shù)重載,所以一旦使用了函數(shù)名max(),其他函數(shù)就不能再使用了,所以相關(guān)的C語言代碼可能如下:

相比之下,使用define宏來定義max()方法顯然更方便。但C語言中的宏定義不提供參數(shù)類型檢查也是一個缺點,可能會導(dǎo)致程序不安全,讀者不要忽略這一點。因此,如果你不 不一定要用define宏定義來解決問題,應(yīng)該盡可能使用函數(shù),如果想得到更高效的代碼,可以使用inline function。

我在上一篇文章中詳細(xì)討論了inline函數(shù)。

C語言中使用宏定義的注意事項

雖然 "函數(shù)式宏定義和在C語言中非常類似于函數(shù),它實際上不是函數(shù)。讀者一定不能忽視這一點,否則可能會寫出一個存在隱患甚至嚴(yán)重錯誤的C語言程序。請看下面的例子:

超過這段C語言代碼編譯執(zhí)行后會輸出什么?

在main()函數(shù)中,變量A和B被初始化為2。然后調(diào)用max()宏,傳遞的參數(shù)分別是a和b。粗略來說,此時執(zhí)行max( a,b)相當(dāng)于執(zhí)行max(3,2),那么上面的C語言程序會輸出3,2,3?獲得答案的最簡單、最粗暴的方法是編譯并執(zhí)行這段代碼。請看:

沒有經(jīng)驗的讀者看到實際的產(chǎn)量估計會感到驚訝。為什么A和M不是3而是4?沒有第二個地方給a加一?如前所述,編譯器會將C語言中的宏定義擴(kuò)展到被調(diào)用的地方,而不是像函數(shù)一樣編譯后再通過call指令調(diào)用。使用gcc -E命令檢查編譯器為上述C語言代碼預(yù)處理的代碼,得到如下結(jié)果。請看:

很明顯,這是 "函數(shù)式宏定義和在C語言中。傳遞給max()的參數(shù)A會展開到宏定義中的所有__a處,這就解釋了為什么A和M最后等于4而不是3。

amp之間還有其他不同之處函數(shù)式宏定義和和實函數(shù),例如 "函數(shù)式宏定義和不適合遞歸。

使用do{}while(0)打包代碼。

雖然 "函數(shù)式宏定義和在C語言中與實函數(shù)相比有一些缺點,只要小心使用,會明顯提高代碼執(zhí)行的效率。畢竟省去了分配釋放堆棧幀、傳遞參數(shù)、返回值等一系列工作。正因為如此,Linux內(nèi)核中有相當(dāng)多的方法是通過使用define宏定義來實現(xiàn)的,而在內(nèi)核C語言代碼中, "函數(shù)式宏定義和通常是通過do { while }來實現(xiàn)的,例如:

為什么用do{}while(0)包裝C代碼?什么?;不使用do{}while(0)包裝有什么問題?請看下面幾行C代碼:

宏定義被編譯器展開后,會生成下面的C代碼:

這可能與程序員 的意圖,在這種情況下_ _ release(lock);不在if(cond)范圍內(nèi)。也許讀者會說,那 這就像一個函數(shù),can 你不就用{}包碼嗎?請看下面幾行C代碼:

問題出在spin_unlock(鎖);后面的分號 " "如果你不 不要寫它,它 這不像函數(shù)調(diào)用。如果寫出來,會造成語法錯誤?!猧f語句將由這個 " "早點結(jié)束,否則就完了。;不要和它搭配。這樣,用do{}while(0)把C語言的代碼包裝在 "函數(shù)式宏定義和C語言的顯然是不行的。錯誤的。

總結(jié)

"函數(shù)式宏定義和不是實函數(shù),它與實函數(shù)不同,如果我們不 我不明白這個。最后,我們分析了do{}while(0)常用于包裝宏定義的代碼的原因。讀者也可以在以后的C語言程序開發(fā)中使用這種技術(shù)。

歡迎在評論區(qū)一起討論提問。這些文章都是手工原創(chuàng)的。每天都有最簡單的C語言、linux等嵌入式開發(fā)介紹。如果你喜歡我的文章,請關(guān)注一波。你可以看到最新的更新和以前的文章。