簡體   English   中英

像C中的宏一樣的功能

[英]Function like Macros in C

我試圖理解像Macros這樣的功能的想法,但有幾點讓我迷惑。 例如,我們說:

#define Max(a,b)  ((a)>(b)) ? (a):(b))

我稱之為

int i = Max(4,5);

這將評估一個等於a>b的條件表達式? 如果是,則a,否則b。 但我對Max函數如何知道如何處理參數感到困惑。 與實際函數不同,實現不是在調用程序的代碼中編寫的。 是定義語句右邊的聲明為我做這個嗎? 這對我來說只是一個新事物,我想確保我理解這里發生的事情。

功能的這個特殊部分就像宏一樣迷惑我。 我知道這些類型的宏對於降低開銷成本很有用,因為它們排除了在堆棧上節省內存的JSR RTS處理器指令。

#define Max(a,b)  ((a)>(b)) ? (a):(b))

是一個宏,除了代碼中的簡單文本替換之外別無其他,這意味着在預處理此行期間:

int i = Max(4,5);

變成:

int i = ((4)>(5)) ? (4):(5));

請注意,使用像這樣的宏時沒有類型安全性,並且在調試代碼時也會非常困難。 好的經驗法則是: 當你可以實現與功能相同時,不要使用宏

int max(int a, int b) {
    return (a > b) ? a : b;
}

在預處理之后,編譯器實際看到的是:

int i = ((4)>(5)) ? (4):(5));

傳遞給宏的參數將替換為宏的主體。

只是停止考慮像可編譯代碼的宏。 宏由預處理器“解析”,而不是在編譯階段。 因此,通過宏定義,您只需定義如何處理文本文件中的某些字符串。 只有預處理器的輸出傳遞給編譯器。 您可以使用gcc -E在預處理器后查看源代碼。 它仍然是此階段的C代碼,但沒有任何預處理器指令。

希望這會幫助你。

嘗試使用gcc -E構建代碼,並在編譯代碼之前查看代碼的外觀

事實上,在構建過程中,編譯器會將您的實際代碼轉換為預處理器代碼。 在預處理器階段,編譯器將c代碼中的所有宏替換為其內容,並生成另一個稱為預處理器代碼的代碼,然后編譯器從預處理器代碼生成目標代碼

gcc -E允許您查看預處理器代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM