Linux宏:__ASSEMBLY__


匯編: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) */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM