ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2013年3月21日 星期四

androd init - keyword.h & define

android 的 system/core/init/init_parset.c 有一種寫法,讓人找不到 code: #include "keywords.h" #define KEYWORD(symbol, flags, nargs, func) \ [ K_##symbol ] = { #symbol, func, nargs + 1, flags, }, struct { const char *name; int (*func)(int nargs, char **args); unsigned char nargs; unsigned char flags; } keyword_info[KEYWORD_COUNT] = { [ K_UNKNOWN ] = { "unknown", 0, 0, 0 }, #include "keywords.h" };

include "keywords.h" 兩次。

keywords.h 是這樣: #ifndef KEYWORD int do_chroot(int nargs, char **args); int do_chdir(int nargs, char **args); int do_class_start(int nargs, char **args); ... #define __MAKE_KEYWORD_ENUM__ #define KEYWORD(symbol, flags, nargs, func) K_##symbol, enum { K_UNKNOWN, #endif KEYWORD(capability, OPTION, 0, 0) KEYWORD(chdir, COMMAND, 1, do_chdir) KEYWORD(chroot, COMMAND, 1, do_chroot) ... #ifdef __MAKE_KEYWORD_ENUM__ KEYWORD_COUNT, }; #undef __MAKE_KEYWORD_ENUM__ #undef KEYWORD #endif

根據有沒有 define KEYWORD,有不同的地方。

這是想要用同一個宣告(定義),同時做出 enum constant 和 struction 宣告的關係。
所以第一個 include 時,會define KEYWORD,只做 enum 的 constant。

第二次 include 時,就會先重新define KEYWORD,作出正確的 key-function pair。

-- 可能很方便,但是讀 code 的人會不好找..

沒有留言:

標籤

網誌存檔