匯編:assembly
猜測:所以這個宏跟匯編有關?!
引用:某些常量宏會同時被C和asm引用,而C與asm在對立即數符號的處理上是不同的。asm中通過指令來區分其操作數是有符號還是無符號的,而不是通過操作數。而C中是通過變量的屬性,而不是通過操作符。C中如果要指明常量有無符號,必須為常量添加后綴,而asm則通過使用不同的指令來指明。如此,當一個常量被C和asm同時包含時,必須做不同的處理。故KBUILD_AFLAGS中將添加一項D__ASSEMBLY__,來告知預處理器此時是asm。
/* linux-3.08/include/linux/const.h */ /* const.h: Macros for dealing with constants. */ #ifndef _LINUX_CONST_H #define _LINUX_CONST_H /* Some constant macros are used in both assembler and * C code. Therefore we cannot annotate them always with * 'UL' and other type specifiers unilaterally. We * use the following macros to deal with this. * * Similarly, _AT() will cast an expression with a type in C, but * leave it unchanged in asm. */
/*
* 上邊的注釋說:一些常量宏同時在匯編和C中使用,然而,我們不能像注釋C的常量宏那樣加一個“UL”或其他后綴。所以我們需要使用以下的宏解決這個問題。
* 例如調用:#define DEMO_MACRO _AT(1, UL):在C中會被解釋為 #define DEMO_MACRO 1UL; 而在匯編中什么都不做,就是: #define DEMO_MACRO 1
*/
#ifdef __ASSEMBLY__ #define _AC(X,Y) X #define _AT(T,X) X #else #define __AC(X,Y) (X##Y) #define _AC(X,Y) __AC(X,Y) #define _AT(T,X) ((T)(X)) #endif #endif /* !(_LINUX_CONST_H) */