如果它在自己的定义中使用,我是否必须预定义类型/结构?

时间:2014-05-17 20:31:20

标签: c struct typedef

我有一个C cfg_struct,其中包含有关如何评估某些数据的信息。为避免评估代码中出现switch,我将正确的评估函数分配给结构本身。

//Some evaluation function
int eval2(cfg_struct* cfg, int*data);
int eval3(cfg_struct* cfg, int*data);
int eval4(cfg_struct* cfg, int*data);
... and so on

然后结构应该是这样的:

struct cfg_struct
{
  int rule;
  ...
  int(*eval_fn)(cfg_struct *cfg, int* data);
};

错误:

error: unknown type name 'cfg_struct'

我试过预定义它,但可以吗?

//My "predefinition":
typedef struct cfg_struct;

1 个答案:

答案 0 :(得分:2)

在使用之前定义类型:

typedef struct cfg_struct ca_cfg_t;

struct cfg_struct
{
  int rule;
  ...
  int(*eval_fn)(ca_cfg_t *cfg, int *data);
};

或者在结构中使用struct表示法:

struct cfg_struct
{
  int rule;
  ...
  int(*eval_fn)(struct cfg_struct *cfg, int *data);
};

typedef struct cfg_struct ca_cfg_t;

您似乎对何时放弃struct感到困惑。在C(与C ++不同)中,您必须提供明确的typedef或继续使用struct tag。因此,您的evalX()函数需要以下其中一项:

typedef struct cfg_struct cfg_struct;
int eval2(cfg_struct *cfg, int *data);

或:

int eval2(ca_cfg_t *cfg, int *data);

或:

int eval2(struct cfg_struct *cfg, int *data);

(在C ++中,只要struct(或typedef),您就可以将标记名称用作不带struct cfg_struct前缀的类型名称而不使用显式class cfg_struct已经出现在某个地方。但这不是C的一部分。)