结构中的成员不属于任何类型吗?和一个持有一个孤独变量的结构 第1部分:PCL_ADD_POINT4D引用了宏第2部分:结构以容纳一个变量

问题描述

我试图理解下面的代码,这是针对在点云中保存XYZ和Intensity值的结构,字段PCL_ADD_POINT4D看起来像是一个独立的语句,没有任何已知类型,该怎么做?那是什么意思是解决内容的一种方法吗?

struct EIGEN_ALIGN16 _PointXYZI
   {
    PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
     union
     {
       struct
       {
         float intensity;
       };
       float data_c[4];
     };
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
   };



这是从 http://docs.ros.org/hydro/api/pcl/html/point__types_8hpp_source.html#l00382

什么是PCL_ADD_POINT4D,并且有任何明显的原因为什么intensity需要在结构中。 干杯。

编辑:

@Beta指出PCL_ADD_POINT4D来自here

在结构中包含intensity仍然很奇怪。 (如果有正当的理由,我将保留这个问题)

解决方法

PCL_ADD_POINT4D是在line 144 of the same file中定义的宏。以大写字母表示的事实已经为我们提供了线索。

除了编译器特定的原因外,我看不出intensity需要处于匿名结构的原因。

,

第1部分:PCL_ADD_POINT4D引用了宏

PCL_ADD_POINT4D指的是以下几行

 #define PCL_ADD_POINT4D \
   union EIGEN_ALIGN16 { \
     float data[4]; \
     struct { \
       float x; \
       float y; \
       float z; \
     }; \
   }; \

此处EIGEN_ALIGN16是一个SSE宏,可帮助优化点操作,因为它们通常应用于在这些情况下定义的类型的向量(在我们的情况下为点向量/云)。

到源文件的链接为here

第2部分:结构以容纳一个变量

我认为这比其他任何事情都更令人赏心悦目的设计模式,我已经习惯了,因为我的眼睛更加熟悉出色的PCL library

在struct中,成员按顺序存储在相邻的内存位置中,而在并集中,所有成员都从同一位置开始,并且确实具有重叠的性质(想象一下,将不同大小(长度)的字符串组合成一个长字符串[struct] vs挂起从一个点(联合)开始,使用不同长度的绳(或绳),在联合情况下,整个物件的长度将是最长的绳的长度。

我们可以利用这些功能为我们的新类型提供一个简洁的外观,而PCL的作者正是这样做的。

struct point_xyz{
    union{
        float x;
        float y;
        float z;
        float padding; // redundant with data[4] already taking care of it
    };
    float data[4];
};

如果我们将point_xyz实例化为例如point1 我们可以通过point1.data[0]point1.x访问它的成员,也可以使用.data将点作为一个整体传递给喜欢这种方式的函数。

那么这与原始问题有什么关系?

我认为这是因为该点类型结构定义在PCL源中非常规则地出现,并且在声明强度时使用相同的蓝图只是为了使人眼部方便。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...