2014-03-24 160 views
2

我在codegolf上看到了這一行代碼。C,這條線是做什麼的?

struct { int (*log)(const char *,...); } console = { printf }; 

這是原帖 https://codegolf.stackexchange.com/questions/24623/write-program-in-your-favorite-language-in-another-language 雖然我知道的C/C++,我不明白這條線。 我想創建同義詞,你使用typefs,那麼這是什麼(console = {printf})。 另外,我根本不瞭解結構。爲什麼一個結構和內部發生了什麼......這是一個指針的轉換?這是什麼,....我們看到裏面?

+1

如果你不認識一個函數指針,一個可變參數函數和一個初始化列表,那麼你可能不會「知道c/C++」。此外,[cdecl.org](http://cdecl.org) – user3447428

+0

我認識到這些元素,但我永遠不會以這種方式編碼。從來沒有在一百萬年... –

+0

誰寫的不會說「C」作爲他們的第一語言。他們正試圖讓C看起來像Java或其後代之一。 – wallyk

回答

2

那麼,讓我們從外面工作中:

struct { T m; } console = { i }; 

你定義與T類型的單個成員m匿名結構類型,然後使用該類型聲明名爲console的變量並使用初始化程序{ i }對其進行初始化。

那麼什麼是T,mi

成員聲明

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,其類型Tint (*)(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"); 
2

這是定義和初始化函數指針log()最初到printf作爲其唯一元素的結構中的項目。

該原型與printf完全兼容。使用這樣的:計算中

console.log ("format string %d %d", param1, param2); 

如果在某一時刻,不同的實際功能應該被用作輸出,指針可以被重新分配。

int myoutputfunction (const char *, ...) 
{ 
    (do something useful here) 
} 

console.log = myoutputfunction; 
0

它是一個包含一個構件是一個指向返回int類型的功能的結構,並且它被初始化爲printf函數的地址。

1
struct { 
    // struct with one member 
    // that member is called log 
    // accepts one const char * 
    // and an arbitrary amount of optional extra arguments 
    int (*log)(const char *,...); 
} 
// declared console variable of type that struct 
console = { 
    // and initialises its first member to 
    printf 
}; 
1
struct { int (*log)(const char *,...); } console = { printf }; 
console.log("abc"); 

在語義上等同於:

typedef int (*FncPtr)(const char *,...); // function pointer 

typedef struct c { 
    FncPtr log; 
} Console;         // struct holding function pointer 

Console console; 
console.log = printf;      // initialization of this pointer 
console.log("abc");      // possible usage 

這只不過是可能的方式如何使一個:

console.log(/* some parameters */); 

產生完全相同的結果:

printf(/* some parameters */); 
+0

我喜歡你如何打破這個... –

+0

@CJohnson:寫太多的代碼到一行只會降低可讀性。保持代碼清潔總是很好:) – LihO

0
struct { int (*log)(const char *,...); } console = { printf }; 

這裏console是一個variable of struct有一個成員log
結構體有一個member that is a pointer to a function,它返回整數並將參數作爲一個常量字符串和可變長度參數...。 分配創建struct variable consoleconsole.log由指向printf()