最近跟着雷神的博客学习 FFMPEG, 在看 FFMPEG 的源码的时候发现有些语句写法和自己平时见的不太一样, 比如下面的语句:
struct SwsContext *img_convert_ctx;
明明 SwsContext 是一个结构体类型名称, 为什么前边还要加一个 struct, 而且这个结构体的定义也是用 typedef struct SwsContext { ...}; 明白过来 FFMPEG 的源码是用 c 写的, 不是用 c++, 所以在用 c++ 编译器编译 FFMPEG 的库头文件的时候要用 extern "C"{ XXX.h ...}.
不能用 c++ 的语法规则来读 FFMPEG 的源码. 这里总结一下 c++ 和 c 在定义结构体的过程中的不同.
1. 在 c 语言中定义一个结构体要用 typedef struct, 即
- // 定义 1
- typedef struct Number
- {
- int a;
- int b;
- };
- // 定义 2
- struct Number
- {
- int a;
- int b;
- };
- // 定义 1 和定义 2 使用时, 都应该这样定义一个结构体变量
- struct Number num1;
但是如果写成如下格式:
- // 定义 3
- typedef struct Number
- {
- int a;
- int b;
- }Num;
- // 定义 3 使用时, 这样申请一个结构体变量
- Num num1;// 或者 struct Number num1;
- // 定义 4
- typedef struct
- {
- int a;
- int b;
- }Num;
- // 使用定义 4
- Num num1;
通过以上各个定义总结:
1. 如果使用 typedef 来定义结构体时: 型如 typedef struct aaa { ..}bbb;
其中 aaa 是可以省略的, 那么用 bbb(如果有的话) 来定义一个结构体变量时, 可以直接用 bbb xxx; 就行. 但用 aaa 来定义一个结构体变量时, 则需要使用 struct aaa xxx;
2. 不使用 typedef 来定义结构体时, 声明该类型变量都需要加上 struct, 即 struct aaa xxx;
但应该注意如下定义形式:
- struct {
- int a;
- int b;
- }OnlyStruct;
- // 使用形式
- OnlyStruct.a=10;
- OnlyStruct.b=20;
上边 OnlyStruct 结构体由于没有类型名, 只能用于 OnlyStruct 这一个变量, 无法再申请该类型结构体的其他变量.
2.C++struct 和 typedef struct 的区别
如果在 c++ 中定义一个结构体如:
- // 定义 1
- struct Number
- {
- int a;
- int b;
- };
- // 使用定义 1 声明该类型结构体变量
- Number num;// 方式 1
- struct Number num;// 方式 2
来源: https://www.2cto.com/kf/201806/757579.html