[英]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 }
對其進行初始化。
那么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
類的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 function
該member that is a pointer to a function
返回整數member that is a pointer to a function
將const字符串和可變長度參數...
作為參數。 分配創建一個struct variable console
, console.log
指向printf()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.