在同一类中向前声明类型

Forward declaration of types in the same class

本文关键字:声明 类型 一类      更新时间:2023-10-16

我有一个类,里面有几个简单的结构体,像这样(简化代码):

typedef struct  
{
    Struct2* str2;
}Struct1;
typedef struct  
{
    Struct3* str3;
    Struct1* str1;
}Struct2;
typedef struct  
{
    Struct1* str1;
    Struct2* str2;
    Struct3* str3;
}Struct3;

当然会导致语法错误。所以我向前声明了每一个,但这不起作用,因为我有重新定义。我想避免把每个结构放在一个单独的文件中;这可能吗?

与其将每个类型声明为typedef,不如像使用类一样使用struct关键字。这样你的定义看起来就不会像前向声明的重新定义了。

struct Struct1;
struct Struct2;
struct Struct1
{
    Struct2* str2;
};  

使用前向声明和定义结构体而不使用typedef,如:

struct Struct2; //forward declaration
struct Struct3; //forward declaration
struct Struct1
{
    Struct2* str2; //here Struct2 is known to be a struct (to be defined later though)
};
struct Struct2
{
    Struct3* str3; //here Struct3 is known to be a struct (to be defined later though)
    Struct1* str1;
};
struct Struct3
{
    Struct1* str1;
    Struct2* str2;
    Struct3* str3;
};

您可以像这样转发声明它们:

typedef struct Struct1 Struct1;
typedef struct Struct2 Struct2;
typedef struct Struct3 Struct3;

你这样解析它们:

struct Struct2 { ... };

我使用了命名结构,所以这是有效的C或c++。正如Nawaz指出的,在c++中根本不需要类型定义。在c++中,结构体的名称自动成为类型,但在C中不是。

这是整个单元:

#include <stdio.h>
typedef struct Struct1 Struct1;
typedef struct Struct2 Struct2;
typedef struct Struct3 Struct3;
struct Struct1  {
        Struct2* str2;
} ;
struct Struct2 {
        Struct3* str3;
        Struct1* str1;
} ;
struct Struct3  {
        Struct1* str1;
        Struct2* str2;
        Struct3* str3;
} ;
int main()
{
        printf("Size of Struct1: %dn", sizeof(Struct1));
        printf("Size of Struct2: %dn", sizeof(Struct2));
        printf("Size of Struct3: %dn", sizeof(Struct3));
}