2017-08-24 80 views
9

W /usr/include/asm/swab.h znalazłem następujący kod:Jakie jest znaczenie takiej definicji "#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 

Jaki jest sens ostatniej linii, określające nazwę jak sama?

+2

w połączeniu '# ifdef'? –

+2

może uniemożliwić jakiemukolwiek innemu kodowi de-zdefiniowanie go bez ostrzeżenia? –

+2

Dlaczego to pytanie jest głównie oparte na opiniach? – haccks

Odpowiedz

8

To się nazywa self-referentitial macro:

Jeden wspólny, użyteczne wykorzystanie samoodniesienia jest utworzyć makro, które rozszerza się do siebie. Jeśli piszesz

#define EPERM EPERM 

następnie makro EPERM rozszerza się EPERM. W efekcie, preprocesor jest pozostawiony sam sobie, gdy jest używany w uruchomionym tekście. Możesz powiedzieć, że to makro z #ifdef. Możesz to zrobić, jeśli chcesz zdefiniować stałe numeryczne z wartością enum, ale mają one wartość #ifdef dla każdej stałej.

+2

excellent! nie można stwierdzić, czy zdefiniowano funkcję, dopóki nie trafisz na "nierozwiązany symbol" w fazie linkera. Z ifdef możesz od razu wiedzieć! –

+0

@ Jean-FrançoisFabre; Tak. Dodaję kolejny przykład, aby wyjaśnić to nieco więcej. – haccks

+1

nie przesadzaj jednak zbyt często. Czasami krótki jest dobry. Przewiduję, że zgarniesz wiele takich akcji. –