【问题标题】:c structures that contain function pointers包含函数指针的 c 结构体
【发布时间】:2013-11-29 02:58:01
【问题描述】:

我使用以下宏声明我的所有结构..

#define structure                     typedef struct

我用这个声明一个结构,例如

structure
{
    int foo;
    int(*proc)(void*);
}
_myobject;

成员 proc ,确实收到了一个指针参数 到它所属的结构..

例如

myobj.proc(&myobj);

我的问题是,如何声明成员 proc 的类型为 作为结构传递给它,而不是void * ..我知道它不会 有区别,这只是为了美观,因为我花了很多时间 保持我的代码干净..

structure
{
    int foo
    int(*foo)(_myobject*);
}
_myobject;

产生:

error: expected ':', ',', ';', '}' or '__attribute__' before 'int'|

【问题讨论】:

  • 你已经声明 proc 是一个函数指针,不是吗?

标签: c pointers structure


【解决方案1】:

您正在尝试递归地引用您的结构,这与 typedef 不兼容。应该执行以下操作之一:

typedef struct _myobject _myobject;
struct _myobject {
  int foo;
  int (*proc)(_myobject*);
};

...

typedef struct _myobject {
  int foo;
  int (*proc)(struct _myobject*);
} _myobject;

编辑:如果你想尽可能地继续使用structure(虽然真的,除了为了与现有代码保持一致,我不确定你为什么要这样做),你可以这样做:

structure _myobject _myobject;
struct _myobject {
  int foo;
  int (*proc)(_myobject*);
};

...

structure _myobject {
  int foo;
  int (*proc)(struct _myobject*);
} _myobject;

虽然这两个都需要使用 struct 标识符,但如果您想避免这种情况。

【讨论】:

  • 问题是 - 现有的源代码( >50k 行),充满了结构 - 我已经取消了所有 struct identifer * , -
  • 我倾向于同意,对此没有干净的解决方案.. 好的 - 我会结束这个问题 - 谢谢
【解决方案2】:

你可以稍微改变一下宏:

#define structure(x,y)                     typedef struct x y x

structure (_myobject,
{
int foo;
int(*proc)(struct _myobject*);
}
);

这对我来说看起来很糟糕。另一种方法是:

#define structure                     typedef struct

structure _myobject
{
int foo;
int(*proc)(struct _myobject*);
}
_myobject;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多