[英]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.