C,这条线做什么?

时间:2014-03-24 14:58:08

标签: c pointers struct

我在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})。 另外,我根本不理解结构。为什么一个结构和内部发生的事情......这是一个指针的投射?这是什么,......我们在里面看到了什么?

6 个答案:

答案 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 }

那么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之类的函数。它会用到这样的东西:

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 };

此处consolevariable of struct,其中有一名成员log struct有一个member that is a pointer to a function返回整数,并将const字符串和变量长度参数...作为参数。 作业创建struct variable consoleconsole.log指向printf()