2015-10-19 56 views
1

我遇到該C宏:C代碼宏例如

#define __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel)\ 
    static struct cmd      \ 
    __cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden\ 
    __attribute__((used)) __attribute__((section("__cmd"))) = { \ 
     .name = (_name),     \ 
     .args = (_args),     \ 
     .cmd = (_nlcmd),     \ 
     .nl_msg_flags = (_flags),    \ 
     .hidden = (_hidden),     \ 
     .idby = (_idby),     \ 
     .handler = (_handler),     \ 
     .help = (_help),     \ 
     .parent = _section,     \ 
     .selector = (_sel),     \ 
    } 

我隱約明白,它試圖從一堆輸入的限定cmd類型的結構PARAMS宏。但我真的不明白這兩條線的意思:

__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden\ 
__attribute__((used)) __attribute__((section("__cmd")))  = {  \ 

有人可以解釋一下嗎?謝謝。

+1

這是令牌粘貼操作符(##)的應用程序。看看這裏 - https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html – Samboy786

回答

1

給你貼宏定義的

__COMMAND(Section, Symname, Name, Args, Nlccmd, Flags, Hidden, Idby, Handler, Help, Sel); 

通話將解析:

static struct cmd 
__cmd_Symname_Handler_Nlcmd_Idby_Hidden 
__attribute__((used)) __attribute__((section("__cmd"))) = { 
    .name = (Name), 
    .args = (Args), 
    .cmd = (Nlcmd), 
    .nl_msg_flags = (Flags), 
    .hidden = (Hidden), 
    .idby = (Idby), 
    .handler = (Handler), 
    .help = (Help), 
    .parent = (Section), 
    .selector = (Sel), 
}; 

static struct cmd 

啓動類型的static對象的定義struct cmd(在其他地方聲明)。

宏行

__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden\ 

使用宏的參數來連接該struct cmd的標識符(顯然希望,這將是唯一的)。

其他已與##運營商的相關文件相關聯;我不會偷他們。

在這一點上,應該指出的是,從__開始的標識符被保留用於(編譯器和標準庫的)實現,所以嚴格來說這會使得程序不符合語言標準。 (這不是問題,因爲使用的下面__attribute__是不可移植的反正。)

__attribute__((used)) __attribute__((section("__cmd"))) = { \ 

套結構的"attributes"。這是編譯器特定的語法擴展。從GCC文檔:

使用

該屬性,連接到具有靜態存儲的變量,意味着即使看來該變量沒有引用的變量必須發射。

部分(「部分名稱」)

通常,編譯器將其生成的對象等數據和bss部分。但是,有時您需要額外的部分,或者您需要某些特定的變量才能出現在特殊的部分中,例如映射到特殊的硬件。 section屬性指定一個變量(或函數)位於特定的部分。 [...]

然後它繼續初始化傳遞給宏的參數的結構成員。