你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

结构体定义的方法之结构体之间相互包含

[复制链接]
fury-roar 发布时间:2016-12-30 17:10
本帖最后由 fury-roar 于 2016-12-31 15:04 编辑
! Y5 j1 u! W4 `9 t) i2 f+ E- j
, v) c$ G: y7 N8 I' F) B  @在定义若干结构体时,可能会出现以下情况,即结构体之间相互包含:, k* ^8 M2 S9 R+ d) B4 L" r
typedef void (*pwmcallback_t)(PWMDriver *pwmp, void *arg);
2 h0 `) N4 M7 G9 ptypedef struct {- I4 u( |5 a+ R
  uint32_t                  frequency;
! }' G: c1 u- R  r/ q6 C% `7 _  pwmcnt_t               period;
% o9 ~; |+ J9 L8 i9 N9 F  pwmcallback_t        callback;
6 G) F/ W  O" d  H( ?$ g} PWMConfig;
( ^5 t" D5 K7 Z6 a5 i6 i5 E' b1 ^typedef struct  {8 b- n3 p9 r1 p& h% T7 r2 T+ \" Y: \
  pwmstate_t                state;( I8 [" n/ H8 R
  const PWMConfig       *config;, ~% R9 C% I  Z2 v- F2 ~. ]5 Y
  pwmcnt_t                   period;
4 l- P5 s2 d( [$ F: L6 a  r7 `} PWMDriver;
" S# d: r# m1 t2 ?: W% c6 i1 q
* H2 |' n; G( m: ~8 U0 Q如果按照上述顺序定义结构体的话,编译出现错误。, L/ m4 \" u7 s. E
现使用下面正确的方法:! k) N/ q1 H6 H9 T, k
typedef struct PWMDriver PWMDriver;
0 n) x& S) a( O$ Z* Ltypedef void (*pwmcallback_t)(PWMDriver *pwmp, void *arg);
) S8 A6 Z4 @- K8 P7 p8 [9 ktypedef struct  {& i7 \! D  O, r' D# b
  uint32_t                  frequency;& t! N4 D( g' E* C. j$ l
  pwmcnt_t               period;" Q( O- p7 G0 y. o! F# i9 |
  pwmcallback_t        callback;
  w4 k: j, {0 z2 t! K+ J7 D} PWMConfig;
; i* l  {5 x5 rstruct PWMDriver {
& C+ I* B: ?8 z6 ]  pwmstate_t                state;
5 k) u+ M% s( v; p& d- O  const PWMConfig       *config;: t' I$ D6 ~* ?" l' H4 X0 _" h
  pwmcnt_t                   period;
( i  a) l( ]' ]7 e} ;9 X% o5 T$ c! k8 i' r3 ~- _0 K
% j7 n- L' Z; E" j* h
" T) T3 e0 h3 J1 Q. {! w3 p
) S+ y3 c; V# R; R' Q9 r4 M/ p7 |' q# A

7 E/ b/ [+ I' n" g! q+ v
赞 收藏 1 评论17 发布时间:2016-12-30 17:10

举报

17个回答
fury-roar 回答时间:2016-12-31 15:00:23
shuolang126 发表于 2016-12-31 08:02
5 m2 F( V" K  n: G有问题吧?2 p3 |, X, B1 n: t; O, U( x1 @! r
typedef struct  {5 V/ G$ ?* A4 L* U& B8 K) T: \
  uint32_t                  frequency;

; n, \" q8 v1 X3 X/ S, F" H2 U笔误,正确的是6 P9 e6 m. t9 g3 C- c. g
typedef struct {' @% v" |5 C! @7 u
  uint32_t                  frequency;* n& n* S" f2 l- H; ]$ T
  pwmcnt_t               period;7 `: @- Z) B+ t5 A4 f3 e1 g) Q
  pwmcallback_t        callback;
( F1 M. Q, Q  |6 f  i" n! D}PWMConfig;
fury-roar 回答时间:2016-12-31 14:59:27
moyanming2013 发表于 2016-12-30 22:427 l, {) L3 ?8 P. N' {. O+ O
没看出来谁相互包含?
! X5 l+ v. N7 V6 V. l你下面的结构体连个名字也没有啊!闹什么啊
6 _& [/ o" ?: \2 k% K
sorry,写错了。
& v. l1 Z- \6 d0 ]5 C应该是
7 S) s! _, X# d( Ftypedef struct {
5 Y" O9 v7 u8 n9 D9 ~  uint32_t                  frequency;9 A7 A7 i( [. M6 P2 P6 y
  pwmcnt_t               period;# W' G: a3 h9 `/ ~. \! j
  pwmcallback_t        callback;
3 K6 A( E: ?: D$ U+ b}PWMConfig;
moyanming2013 回答时间:2016-12-30 22:42:18
没看出来谁相互包含?
! @4 m  m( M4 Y$ R5 b你下面的结构体连个名字也没有啊!闹什么啊7 c; n, t& B7 z' D! V$ r) H
  1. typedef struct {
    : D6 b1 |5 U. B4 k! N
  2.   uint32_t                  frequency;
    3 g# _0 B& h; V; }6 Q
  3.   pwmcnt_t               period;
    . n/ m' S: m' z! i% j/ K& }
  4.   pwmcallback_t        callback;
    6 b  _3 I& ^7 K0 V9 n( u% x
  5. };
复制代码
peter001 回答时间:2016-12-30 17:50:57
这个要学一下
五哥1 回答时间:2016-12-30 23:52:04
认真学习中
shuolang126 回答时间:2016-12-31 08:02:13
有问题吧?
, o6 m$ O2 R; b% Y& Ztypedef struct  {
9 d+ H8 Q0 T; r1 ^4 s0 ?+ G5 \  uint32_t                  frequency;
4 [* ^1 M3 a8 h- U  pwmcnt_t               period;+ G4 d9 X# P' S& ~; l
  pwmcallback_t        callback;
, U$ P# v) r! A4 B$ P};
% M$ ?( x- g, B9 d4 Z; Z这个明显存在语法错误啊!
小小超 回答时间:2016-12-31 08:15:13
进来学习一下
yhyeefocus 回答时间:2016-12-31 08:30:08
占位               
黑皮男 回答时间:2016-12-31 08:55:39
学习学习
海迹天涯 回答时间:2016-12-31 11:12:19
给你顶起
zbber 回答时间:2016-12-31 17:31:35
学习学习,支持一下 楼主加油3 B' ~3 H/ K- w1 {0 s
moyanming2013 回答时间:2016-12-31 19:13:23
本帖最后由 moyanming2013 于 2016-12-31 19:17 编辑
& Z+ |9 F3 y" g$ K8 y! S/ G  n& @6 r9 f
fury-roar 发表于 2016-12-31 14:59
& R% W, b; {5 h* f4 psorry,写错了。( E4 l* R! C! {: N; N+ B
应该是
0 F. R2 a. i$ m$ E4 ttypedef struct {
) ?2 b2 |7 @4 H' z- Y
那也没有“相互包含”啊?!, H- C6 c3 h4 L* y8 ?
只是一个结构体的成员是另一个结构体的对象。0 y( i- I" D% i2 y: {- v
如果存在了“相互包含”,那么说明你在构建结构体时数据封装是有问题的。/ i" Z& b( Y# I, I2 V* M6 ~3 C# I
不可能有如下情形:
: b6 j3 k3 W$ N- s, \鸟类包含喜鹊,而喜鹊又包含鸟类。
leo121_3006061 回答时间:2017-1-1 10:15:52
damiaa 回答时间:2017-1-1 10:33:23
好好讨论讨论
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版