今天在 TLPI 看到這個寫法,於是來紀錄一下。
__attribute__((xxxx))
語法__attribute__((noreturn))
通常是處理 error 的 function,處理完之後直接 exit()
所以在寫的時候已經確定他不會 return 了
以下是一個例子:
void err_exit(const char *err_msg);
void
err_exit(const char *err_msg)
{
fprintf(stderr, "%c", err_msg);
exit(1);
}
他 print 出錯誤訊息之後就會 exit 了,
所以絕對不會 return
因為不會 return 所以 compiler 對於這個點有個優化的空間,
但前題是:寫程式的人必須要先告訴 compiler 這個 function 有不會 return 的特性
而以下就要說明要如何告訴 compiler 這個點
__attribute__((xxxx))
語法例:
int foo() __attribute__((xxxx)); /* 要把 xxxx 替換掉 */
代表的就是 foo()
這個 function 有 xxxx
這個特性 (attribute)
compiler 可以針對這個 xxxx
的 attribute 來進行優化
至於 xxxx
實際上可以填上哪些 attribute ,
可參考這個網頁
__attribute__((noreturn))
noreturn
就是其中一個 attribute
他代表的是這個 function 不會 return
所以剛剛的例子可以改成:
void err_exit(const char *err_msg) __attribute__ ((noreturn));
void
err_exit(const char *err_msg)
{
fprintf(stderr, "%c", err_msg);
exit(1);
}
這樣寫的話,compiler 就知道他可以完全不考慮這個 function 要如何 return 的問題
可以針對這點進行一點優化