【问题标题】:function pointers within a struct but with functions of different prototype in C结构内的函数指针,但在 C 中具有不同原型的函数
【发布时间】:2012-03-02 15:28:05
【问题描述】:

假设我有函数:

void func1(int x)
{
    ....
}

void func2(int x, int y)
{
    ....
}

void func3(int x, int y, int z)
{
    ....
}

并说我想在结构中拥有一个函数指针:

例如

typedef struct{
     char *ename;
     char **pname;
    < and here I want to have a function pointer> ??
} Example;

Example ex[3];

现在,我想将 ex[3] 数组填充为:

ex[0].ename = "X0";
ex[0].pname[0]="A0";
ex[0].pname[1]="B0";
ex[0].<function pointer to func1() > ??


ex[1].ename = "X1";
ex[1].pname[0]="A1";
ex[1].pname[1]="B1";
ex[1].<function pointer to func2() > ??

...等等...

是否可以创建这样的东西?请帮我解决一下这个。谢谢。

【问题讨论】:

  • 健全性检查:当您决定调用该函数时,您如何“知道”要传递多少个操作数?

标签: c function pointers struct prototype


【解决方案1】:

我会使用 union 的函数指针:

union {
    void (*fun1)(int);
    void (*fun2)(int, int);
} fptr;

您还需要结构中的一个字段来说明使用了哪个。

【讨论】:

    【解决方案2】:

    你有两种选择——草率但容易,或精确但艰苦。

    马虎

    typedef struct{
         char *ename;
         char *pname[3];
         void (*function)();   // Pointer to function taking indeterminate arguments
    } Example;
    
    Example ex[3] =
    {
        { "func1", { "x",           }, func1 },
        { "func2", { "x", "y",      }, func2 },
        { "func3", { "x", "y", "z", }, func3 },
    };
    

    如果您在 GCC 中使用 -Wstrict-prototypes 编译,这不会通过集合。请注意,我确保有存储参数名称 - 您的原始文件有 char **pname,这意味着您必须在分配名称之前为数组分配存储空间。

    苦心

    typedef struct{
         char *ename;
         char *pname[3];
         union
         {
             void (*f1)(int x);
             void (*f2)(int x, int y);
             void (*f3)(int x, int y, int z);
         } u;
    } Example;
    
    Example ex[3] =
    {
        { "func1", { "x",           }, .u.f1 = func1 },
        { "func2", { "x", "y",      }, .u.f2 = func2 },
        { "func3", { "x", "y", "z", }, .u.f3 = func3 },
    };
    

    这使用 C99 指定的初始化程序来进行初始化。它将每个函数指针分配给正确类型的联合元素。

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 1970-01-01
      • 2013-05-22
      • 2018-01-29
      • 2017-03-26
      • 2019-11-02
      • 2015-04-18
      相关资源
      最近更新 更多