关于C语言中作用域的问题,在看openpilot源码的时候对一处作用域的用法不理解

biu~biu~biu_ 2018-09-13 09:22:09
在openpilot源码中,滤波部分的代码中有一处,将矩阵转化为array形式的代码,函数深入之后发现对其中一段宏定义的代码不能理解,下面贴出代码,还望能够高人指点一二。

下面是一个循环,将数据转化为13组数组的形式
for (t = 0; t < EKFCONFIGURATION_P_NUMELEM; t++) {
if (invalid_var(EKFConfigurationPToArray(this->ekfConfiguration.P)[t])) {
return 2;
}
}

下面是EKFConfigurationPToArray() 函数的宏定义
#define EKFConfigurationPToArray( var ) UAVObjectFieldToArray( EKFConfigurationPData, var )

再深入一层到UAVObjectFieldToArray() 的宏定义

/**
* helper macro to access multi-element fields as array
*/
#define UAVObjectFieldToArray(type, var) \
(*({ type *const dummy = &(var); \
&(((type##Array *)dummy)->array); } \
))

上面的宏定义中
{ type *const dummy = &(var); \
&(((type##Array *)dummy)->array); }

是一个作用域。
但是为什么在这个作用域前面还要加上*,这个用法的作用是什么,思考了很久还是想不明白,希望高人能解答一下,谢谢!!











...全文
192 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2018-09-13
  • 打赏
  • 举报
回复
建议不要这样去看复杂宏展开。用gcc -E main.c来看宏展开的结果,并对结果格式化(就是排排整齐),这样会比较好理解些。

一般来说,如果代码中有*(),那么()中差不多就是个指针类型,而*就是解引用。
NexTor 2018-09-13
  • 打赏
  • 举报
回复
参考http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html#Statement-Exprs
好像是返回语句块中最后语句的返回值,你这应该是对&(((type##Array *)dummy)->array); 进行解地址操作吧。

69,337

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧