使用稍后声明的 C 结构体

问题描述 投票:0回答:4

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

文件容器.h

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

文件 thetype.h

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

文件main.c

#include "container.h"
#include "thetype.h"
...
c coding-style typedef forward-declaration
4个回答
5
投票

替换此行:

// i would place a sort of struct prototype here

用这些行:

struct TheType;
typedef struct TheType TheType;

由于您需要在定义类型

TheType
之前定义类型
Container
,因此您必须使用类型
TheType
的前向声明 - 为此,您还需要结构体
TheType
的前向声明。

那么你就不会像这样定义 typedef

TheType

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

但是你将定义结构体

TheType
:

struct TheType {......};

5
投票

在容器中.h:

struct _TheType;
typedef struct _TheType TheType;

比在 thetype.h 中:

struct _TheType { ..... };

1
投票

您可以在 typedef 中声明一个结构体:

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

请注意,在 C89 和 C99 中,一个翻译单元中最多只能有

typedef
(这与 C11 和 C++ 不同)。

稍后您必须定义实际的

struct TheType_Struct { /* ... */ }


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; }

上面的

module是合法的(并且用gcc编译没有警告)。

© www.soinside.com 2019 - 2024. All rights reserved.