簡體   English   中英

C,這行是做什么的?

[英]C, what does this line do?

我在codegolf看到了一個主題的代碼行。

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})。 另外,我根本不了解該結構。 為什么是結構以及內部發生了什么...這是指針的轉換嗎? 這是什么.....我們在里面看到了嗎?

那就是定義和初始化函數指針log()最初將printf指向結構中的一項作為其唯一元素。

該原型與printf完全兼容。 像這樣使用它:

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

如果在計算過程中的某個時刻,應將不同的實際函數用作輸出,則可以重新分配指針。

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

console.log = myoutputfunction;

因此,讓我們從外部進行以下工作:

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

您將使用一個類型為T的單個成員m定義一個匿名結構類型,然后使用該類型聲明一個名為console的變量,並使用一個初始化器{ i }對其進行初始化。

那么Tmi什么?

會員聲明

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類的printf 它將使用如下形式:

struct { int (*log)(const char *, ...); } console = { printf };
...
console.log("%s\n", "This is a test");
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
};
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 */ );

它是一個結構,其中包含一個成員,該成員是指向返回int類型的函數的指針,並且正在將其初始化為printf函數的地址。

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

這里console是具有一個成員log variable of struct
struct有一個member that is a pointer to a functionmember that is a pointer to a function返回整數member that is a pointer to a function將const字符串和可變長度參數...作為參數。 分配創建一個struct variable consoleconsole.log指向printf()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM