使用稍后声明的C结构

时间:2012-02-05 21:43:15

标签: c coding-style typedef forward-declaration

我想使用尚未定义的typedef结构,但稍后会使用。 是否有类似结构原型的东西?

file container.h

// i would place a sort of struct prototype here
typedef struct 
{
 TheType * the_type;
} Container;

提交thetype.h

typedef struct {......} TheType;

file main.c

#include "container.h"
#include "thetype.h"
...

4 个答案:

答案 0 :(得分:4)

在container.h中:

struct _TheType;
typedef struct _TheType TheType;

比在the.h中:

struct _TheType { ..... };

答案 1 :(得分:3)

替换此行:

// i would place a sort of struct prototype here

这些行:

struct TheType;
typedef struct TheType TheType;

由于您需要在定义类型TheType之前定义类型Container,因此您必须使用类型TheType的前向声明 - 并且为此您还需要前向声明struct TheType

然后你不会像这样定义typedef TheType

typedef struct {......} TheType;

但您将定义struct TheType

struct {......};

答案 2 :(得分:1)

您可以在typedef中声明一个struct:

typedef struct TheType_Struct TheType;  // declares "struct TheType_Struct"
                                        // and makes typedef
typedef struct
{
    TheType * p;
} UsefulType;

请注意,您在C89和C99中可能只有at most one typedef in one translation unit(这与C11和C ++不同)。

稍后您必须定义实际的struct TheType_Struct { /* ... */ }

答案 3 :(得分:1)

您无法定义尚未定义的struct的对象;但您可以定义指向此类struct

的指针
struct one {
    struct undefined *ok;
    // struct undefined obj; /* error */
};

int foo(void) {
  volatile struct one obj;
  obj.ok = 0;               /* NULL, but <stddef.h> not included, so 0 */
  if (obj.ok) return 1;
  return 0;
}

以上模块是合法的(并且在没有警告的情况下使用gcc编译)。