syscall_define3分析
1.syscall_define3(socket, int, family, int, type, int, protocol)
2.#define syscall_define3(name, ...) syscall_definex(3, _##name, __va_args__)
3.#define syscall_definex(x, sname, ...)\
__syscall_definex(x, sname, __va_args__)
4.#define __syscall_definex(x, name, ...)\
asmlinkage long sys##name(__sc_decl##x(__va_args__))
5.#define __sc_decl1(t1, a1)t1 a1
#define __sc_decl2(t2, a2, ...) t2 a2, __sc_decl1(__va_args__)
#define __sc_decl3(t3, a3, ...) t3 a3, __sc_decl2(__va_args__)
#define __sc_decl4(t4, a4, ...) t4 a4, __sc_decl3(__va_args__)
#define __sc_decl5(t5, a5, ...) t5 a5, __sc_decl4(__va_args__)
#define __sc_decl6(t6, a6, ...) t6 a6, __sc_decl5(__va_args__)
上面四步就是整個syscall_define3巨集定義的每個步驟下面對他們進行組合
name...
socketint, family, int, type, int, protocol
syscall_define3(socket, int, family, int, type, int, protocol)
等於syscall_define3(socket, ...)
等於syscall_definex(3, _socket, int, family, int, type, int, protocol)
等於__syscall_definex(3, _socket,int, family, int, type, int, protocol)
等於asmlinkage long sys_socket(__sc_decl##3(int, family, int, type, int, protocol))
等於asmlinkage long sys_socket(__sc_decl##3(int, family, int, type, int, protocol))
等於asmlinkage long sys_socket(__sc_decl3(int, family, int, type, int, protocol))
asmlinkage long sys_socket(int family ,__sc_decl2(int, type, int, protocol))
asmlinkage long sys_socket(int family ,int type ,__sc_decl1(int, protocol))
asmlinkage long sys_socket(int family ,int type ,int protocol)
這樣分解之後就得到了函式
asmlinkage long sys_socket(int family ,int type ,int protocol)
備註:__va_args__:總體來說就是將左邊巨集中 ... 的內容原樣抄寫在右邊 __va_args__ 所在的位置。它是乙個可變引數的巨集,是新的c99規範中新增的,目前似乎只有gcc支援(vc從vc2005開始支援)。要注意的是,printf 的輸出格式是括號內左邊是字串,右邊是變數,而且右變數與左輸出格式是一一對應的。所以在上面那個例子中, __va_args__只能是一些不含任何變數的字串常量。因為上面的例子中若__va_args__含有變數,整個printf的輸出與變數便不能一一對應,輸出會出錯。
一 巨集定義(3) 檢視巨集展開
從乙個巨集定義開始說起 define mul a,b a b 乍看之下這個巨集定義並沒有什麼問題,但是當你採用如下用法的時候就會出現問題了 int main char argv intargc 執行後輸出 可以看到結果並不是我們預期的 5 9 45,這個時候我們可能就會想到怎麼去檢視巨集展開後是變成...
VBA系列 3 巨集錄製器
使用巨集錄製器的注意事項 啟動巨集錄製器 啟用excel,選擇 開發工具 錄製巨集 命令 在 錄製巨集 對話方塊中有一些可以設定的選項。清理已錄製的巨集 在很多情況下,錄製好的巨集 中包含了可以被刪除的無關命令。巨集錄製器生成的 不一定是最有效的,理解這一點很重要。如果檢驗生成的 會看到excel通...
switch to巨集第3個引數分析
switch to巨集第3個引數很多初學者不能理解,我經過多方查詢,終於得到解答,寫個博文,給大家參考。在switch to巨集呼叫前prev指向程序a,同時也是程序a的區域性變數,switch to巨集呼叫後,因為棧發生了切換 包括esp和ebp prev成為了程序b的區域性變數,而在schedu...