在结构中初始化函数指针[重复]

Posted

技术标签:

【中文标题】在结构中初始化函数指针[重复]【英文标题】:Initializing function pointers in struct [duplicate] 【发布时间】:2018-02-18 15:31:52 【问题描述】:
typedef struct foo
    void (*del)(void *toDel);
    char* (*p)(void *tp)
 Foo;

Foo init(char* (*print)(void*),void (*delFunc)(void*));

试图弄清楚如何将提供的参数分配或初始化给结构函数指针。

【问题讨论】:

【参考方案1】:

How to initialize a struct in accordance with C programming language standards

你可以按照通常的方式来做:

Return (Foo).del=delFunc, .p=print;

【讨论】:

我需要创建一个变量类型的 Foo 吗?即 Foo foo; foo.del = delFunc 什么是Return【参考方案2】:
Foo init(char* (*print)(void *toBePrinted),void (*delFunc)(void *toBeDeleted))

    return Foo .del = delFunc, .p = print;

这个呢?长格式:

Foo init(char* (*print)(void *toBePrinted),void (*delFunc)(void *toBeDeleted))

    Foo tmp = 
        .del = delFunc,
        .p = print
    ;
    return tmp;

【讨论】:

你是说 .del = delFunc .p = print 吗? @waffles 是的,没错,对不起 这是 C99 还是 C11 标准符号? @MahonriMoriancumer 是的,它是本地的,但由于函数的返回类型是Footmp 变量将被复制到调用者。例如,如果调用者执行Foo ptrs_to_fncs = init(ptr1, ptr2);,其中ptr1ptr2 是指向函数的适当指针,那么tmp 将被复制到ptrs_to_fncs,因此没有UB。在 C 中返回结构类似于在 C++ 中返回对象——它们被复制。当然,init() 函数可以重写为使用动态分配的内存。 @iBug 这些是指定初始化器,按照 C99 标准引入 C,但 i. e.使用 GCC,它们甚至可以在 C89 和 C++ 中用作编译器扩展(尽管可能存在一些限制)。【参考方案3】:

foo 定义为Foo 并对其进行初始化的直接(最向后兼容的方法)是:

Foo foo =  /* Mind the order of the following initialisers!  */
  delFunc,
  print
;

【讨论】:

以上是关于在结构中初始化函数指针[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在构造函数中初始化指向字符串的指针数组[重复]

结构体内结构体指针是,在函数中对结构体指针进行操作值会发生变化?

结构体中定义函数指针

函数指针初始化

go语言基础函数,数组,指针,结构体

go语言基础函数,数组,指针,结构体