C 语言结构体类型声明与定义分离:

问题描述:

假设代码 A 处用到一个结构体 S, 但 S 的定义依赖于 A 处后续的其它类型,因此 S 不能简单地放到 A 处之前定义(比较麻烦,也不是不可,用我现在说的方法就可以)。

解决方法:

结构体的真实定义放在后边不动它,前边使用到的地方只在其之前进行类型定义即可(typedef struct SignalAnalyser SignalAnalyser;),类似函数的声明。

常用于解决类似这种警告:

warning: ‘struct SignalAnalyser’ declared inside parameter list will not be visible outside of this definition or declaration
void (onMatchFrequency)(struct RecognitionListener _this, struct SignalAnalyser _analyser, struct EventInfo _event,

再比如说可以把结构体定义放到 .c 文件内部,.h 头文件中只进行类型声明,这样不把真实元素暴露出去。

还有其余的用处就不多说了,有经验的前辈应该比我更了解。

附图:

C语言结构体类型声明与定义分离 - 图1

结构体在头文件中声明, 源文件中定义的实例
person.h

  1. //声明struct Person
  2. typedef struct Person Person;
  3. struct Person* PersonNew();
  4. void PersonPrint(struct Person*);

person.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "person.h"
  5. // 定义struct Person
  6. struct Person
  7. {
  8. int age;
  9. char name[32];
  10. };
  11. struct Person* PersonNew()
  12. {
  13. // 新建一个struct Person 并返回
  14. ...
  15. }
  16. void PersonPrint(struct Person* person)
  17. {
  18. // 函数的实现
  19. printf("name:%s, age:%d\n", person->name, person->age);
  20. }

就像函数在头文件中声明, 而在源文件中定义一样。

这样写的好处是: 对用户透明。 试想一下, 你要写一个库, 里面有个结构体, 但这个结构体只是内部使用和作为参数传递, 那么用户自然就不关心这结构题的内部结构了, 用户只要知道哪个函数返回该结构体和哪个函数要使用该结构体作为参数, 只要引用和传递, 所以, 只在头文件声明该结构体, 让用户可以声明和传递这一结构体的变量即可。 就像上面的例子,使用者只需要 #include “person。h”,然后调用 PersonNew 和 PersonPrint,无需知道 Person 的具体内容。
https://blog。csdn。net/spy007/article/details/100573253