【问题标题】:Can somebody help me with this forward declaration in C? [duplicate]有人可以帮助我在 C 中进行这个前向声明吗? [复制]
【发布时间】:2016-09-18 12:13:48
【问题描述】:
typedef void* (*_add_elem)(shm_ds_t *ds, void *key, void *value, int size);
typedef void* (*_lookup)(shm_ds_t *ds, void *key);
typedef void  (*_dump)(shm_ds_t *ds);
typedef int   (*_compare)(void *key1, void *key2);

typedef struct shm_ds{
           void *ds;
           _add_elem shm_add_elem;
           _lookup  shm_lookup;
           _dump dump;
           _compare compare;
} shm_ds_t;

它的鸡和蛋的问题。我已经定义了一些使用shm_ds_t 类型的回调fn 指针,但是这种类型是在回调定义之后定义的。同样,如果我更改顺序,那么它会报告与在这种情况下定义之前应使用的回调定义相同的问题。任何人都可以建议这个解决方案吗?

【问题讨论】:

  • 为什么不加typedef struct shm_ds shm_ds_t
  • OT:后缀 _t 是 POSIX 保留的。因此,为了与 POSIX 兼容,请为类型制定不同的命名方案。
  • @Sourav Ghosh,在应用您的建议后,我得到了这个编译错误:注意:预期的 'void * ()(struct shm_ds *, void *, void *, int)' 但参数是'void * ()(struct shm_ds_t *, void *, void *, int)' 类型的它区分 struct shm_dsstruct shm_ds_t
  • 这是shm_ds_t 而不是struct shm_ds_t
  • 但编译器稍后会抱怨。

标签: c declaration forward


【解决方案1】:

你需要在回调之前定义类型

添加

typedef struct shm_ds shm_ds_t;

在回调之前和之后,使用

struct shm_ds{
           void *ds;
           _add_elem shm_add_elem;
           _lookup  shm_lookup;
           _dump dump;
           _compare compare;
};

你应该很高兴。

【讨论】:

  • 在其他文件中,我看到了这个错误:shm_ds->shm_add_elem = shm_add_elem;其中 shm_add_elem 是指向函数 void * shm_ll_add_elem(shm_ds_t *ds, void *key, void *value, int size); 错误的指针:./LinkedList/./../shm_ds.h:21:1: 注意:预期的 'void * ()(struct shm_ds *, void *, void * , int)' 但参数的类型为 'void * ()(struct shm_ds_t *, void *, void *, int)'
  • @AbhishekSagar 显示你如何称呼他们。
  • @AbhishekSagar: "but argument is of type ‘void * ()(struct shm_ds_t *, ..." 再次:struct shm_ds_t 不是有效类型。请改用shm_ds_t
  • 在 Main 中,我正在执行以下操作:shm_ds->shm_add_elem = shm_add_elem;其中shm_add_elem 是指向函数void * shm_ll_add_elem(shm_ds_t *ds, void *key, void *value, int size) 的指针。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2017-03-19
  • 2013-03-02
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
相关资源
最近更新 更多