簡體   English   中英

像宏一樣的函數返回值

[英]Function like macros returning a value

最近遇到了以下示例,這些示例返回讀取為__ret但沒有return語句的寄存器

#define READWORD(offset)       ({ \
                 unsigned short __ret=0;\
                 __ret = readw(offset);\
                 __ret; \
                 })

Google是否也是如此,並發現宏等函數可以返回值。 是否可以安全地假定最后一條語句“ _ ret”等效於返回值? 如果我在“ _ret” 之后有另一條更改__ret值的語句怎么辦。 哪一個會退貨?

這使用的是稱為Statement Expressions的GCC擴展。

可以使用它,除非需要移植到GCC(和Clang / LLVM)以外的編譯器上。

讓我們分解一下。 例如,讓我們看看READWORD(1)會做什么。 預處理器將插入以下內容:({{unsigned short __ret = 0; __ret = readw(1); __ret;})

現在我們可以看到它在做什么。 我們只是調用帶有參數(1)的函數readw並將其分配給無符號short。 之后我們只有__ret行; 盡管這是一個完全有效的語句,但它似乎沒有執行任何操作。 但是請繼續閱讀!

}之后的所有內容都超出范圍。

但是,括起來的()可以改變一切。 優雅地講,整個過程是一個具有__ret值的表達式。 因此,您可以為其分配變量。 這使得整個事情在宏參數中非常穩定。

這有助於取消選擇嗎?

暫無
暫無

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

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