匿名 struct 的前向声明
C/C++ 中的前向声明经常用于当头文件中的接口参数为指针时,做前向声明而非引用头文件。
但有时我们在使用别人提供的头文件时,可能会遇到匿名 struct。
我们先来看下为什么有人会定义匿名结构体。
1. 当定义树的节点结构:
struct Node {
int value;
struct Node *left;
struct Node *right;
};
2. 有些人不想每次该结构时都输入 struct,于是:
struct Node_S {
int value;
struct Node_S *left;
struct Node_S *right;
};
typedef struct Node_S Node;
3. 然后有人觉得还可以让上面的代码更精简一些,于是:
typedef struct Node_S {
int value;
struct Node_S *left;
struct Node_S *right;
} Node;
4. 对于上面的 Node_S,由于结构体本身也使用了该结构,所有不能将 Node_S 省去,但是对于有些结构体,如 Person:
struct Person {
bool sex;
int age;
};
5. 如果在使用该结构时不想敲 struct,于是:
typedef struct {
bool sex;
int age;
} Person;
这就是标题中所说的匿名结构体,对于这种结构体,乍一看好像做不到前向声明,但是:
定义一个新的头文件 new_library.h
#include "old_library.h"
struct PERSON: public Person {};
在之后的代码中,使用 PERSON,就可以进行前向声明了:
struct PERSON;
Bingo !!!
注:当然这是在使用别人提供的头文件时不得已的做法,我们自己写的头文件还是尽量避免匿名结构体。
Copyright © 2016-2024 by 赵军旺