那麼,讓我們從外面工作中:
struct { T m; } console = { i };
你定義與T
類型的單個成員m
匿名結構類型,然後使用該類型聲明名爲console
的變量並使用初始化程序{ i }
對其進行初始化。
那麼什麼是T
,m
和i
?
成員聲明
int (*log)(const char *, ...);
分成如下
log -- log
(*log) -- is a pointer to
(*log)( ) -- a function
(*log)(const char *, ...) -- taking a fixed parameter of type
const char *, followed by a variable
number of parameters
int (*log)(const char *, ...); -- returning int
因此,會員m
被命名爲log
,其類型T
是int (*)(const char *, ...)
。
的初始化表達是
{ printf }
的原型printf
是
int printf(const char *, ...);
除了當它是sizeof
或一元&
運營商的操作數,類型的函數符號「函數返回T
「將被轉換爲」返回T
函數的指針類型「表達式。因此,初始化程序中表達式printf
的類型爲
int (*)(const char *, ...);
看起來很熟悉嗎?這是log
成員的相同類型。
TL; DR版本
你創建包含名爲log
單個部件,它是用來指向像printf
的功能的結構類型。它會被用來這樣的:
struct { int (*log)(const char *, ...); } console = { printf };
...
console.log("%s\n", "This is a test");
如果你不認識一個函數指針,一個可變參數函數和一個初始化列表,那麼你可能不會「知道c/C++」。此外,[cdecl.org](http://cdecl.org) – user3447428
我認識到這些元素,但我永遠不會以這種方式編碼。從來沒有在一百萬年... –
誰寫的不會說「C」作爲他們的第一語言。他們正試圖讓C看起來像Java或其後代之一。 – wallyk