德寧preprocession,預處理器將取代__COMMAND_HANDLER(name, extra ...)
宏的所有地方,以它的機身採用替代的name
和extra...
每個OCCURENCES其身體內部到您指定的令牌。
這意味着,無論你的name
參數輸入這種情況下,這將是一個函數名,extra...
將是第一個(struct command_invocation *cmd
)旁的附加參數。
例如,下面的一行:
__COMMAND_HANDLER(foo, int param) {
/* definition */
}
後預處理將是:
int foo(struct command_invocation *cmd, int param) {
/* definition */
}
一個重要的事情必須要澄清:在##
extra
之前並命名變量參數(使用extra...
代替...
)不是c標準的一部分,但它們是GNU extensions。逗號後面的##
的作用使您不指定變量參數。編譯與海灣合作委員會(與-pedantic
標誌)時,它的使用方法如下的例子,你會看到警告信息:在##
運算符兩邊
/* The following example will print the following messages:
* warning: ISO C does not permit named variadic macros [-Wvariadic-macros]
* warning: ISO C99 requires at least one argument for the "..." in a variadic
* macro
*/
__COMMAND_HANDLER(bar);
一般情況下,##
是令牌串聯操作,即兩個令牌組合成一個單一的。例如:
#include <stdio.h>
#define FOO(name, number) void name##number()
FOO(bar, 1) { puts("I'm first."); }
FOO(bar, 2) { puts("I'm second."); }
int main() {
bar1();
bar2();
return 0;
}
請注意,宏定義不是標準C;它使用的是GNU擴展。如果它是一個標準的宏,那麼在三個點之前會有一個逗號。此外,以雙下劃線(或下劃線和大寫字母)開頭的名稱保留供'執行'使用。你不應該在你自己的代碼中定義這樣的宏。 –