我在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})。 另外,我根本不理解结构。为什么一个结构和内部发生的事情......这是一个指针的投射?这是什么,......我们在里面看到了什么?
答案 0 :(得分:2)
这是将函数指针log()
最初定义并初始化为printf
到结构中的项目作为其唯一元素。
原型与printf完全兼容。像这样使用它:
console.log ("format string %d %d", param1, param2);
如果在计算过程中的某个时刻,应该使用不同的实际函数作为输出,可以重新指定指针。
int myoutputfunction (const char *, ...)
{
(do something useful here)
}
console.log = myoutputfunction;
答案 1 :(得分:2)
所以,让我们从外面开始工作:
struct { T m; } console = { i };
您正在定义具有m
类型的单个成员T
的匿名结构类型,然后使用该类型声明名为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");
答案 2 :(得分: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
};
答案 3 :(得分: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 */ );
答案 4 :(得分:0)
它是一个包含一个成员的结构,该成员是一个返回int类型的函数的指针,并且它被初始化为printf函数的地址。
答案 5 :(得分:0)
struct { int (*log)(const char *,...); } console = { printf };
此处console
是variable of struct
,其中有一名成员log
struct有一个member that is a pointer to a function
返回整数,并将const字符串和变量长度参数...
作为参数。
作业创建struct variable console
,console.log
指向printf()