2017-08-24 60 views
9

在/usr/include/asm/swab.h我發現下面的代碼:這樣定義「#define __arch_swab32 __arch_swab32」是什麼意思?

static __inline__ __u32 __arch_swab32(__u32 val) 
{ 
    __asm__("bswapl %0" : "=r" (val) : "0" (val)); 
    return val; 
} 
#define __arch_swab32 __arch_swab32 

什麼是最後一行的含義,定義名稱本身?

+2

加''ifdef'? –

+2

可能會阻止其他代碼在沒有警告的情況下對其進行定義? –

+2

爲什麼這個問題主要基於意見? – haccks

回答

8

這就是所謂的self-referentitial macro

一個常見的自我參照有益用途是創建用於擴展給自己的宏。如果你寫

#define EPERM EPERM 

那麼宏EPERM擴展到EPERM。實際上,只要預處理器在運行文本時使用它,它就會一直保留下來。你可以知道這是一個與#ifdef的宏。如果你想用enum定義數字常量,你可以這樣做,但每個常量的#ifdef爲真。

+2

優秀!在連接器階段點擊「未解析符號」之前,您無法確定是否定義了函數。用ifdef你可以馬上知道! –

+0

@ Jean-FrançoisFabre;是。我再增加一個例子來解釋它。 – haccks

+1

雖然不會讓你的答案超負荷。有時候短是好的。我預測你會像這樣飆升很多漲價。 –