表示这行代码是类型名;?(CPP LIO-SAM开码)



我正在学习io - sam开放代码。由于我不擅长cpp,所以我对cpp代码没有什么疑问。

struct VelodynePointXYZIRT
{
PCL_ADD_POINT4D
PCL_ADD_INTENSITY;
uint16_t ring;
float time;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
} EIGEN_ALIGN16;
POINT_CLOUD_REGISTER_POINT_STRUCT (VelodynePointXYZIRT,
(float, x, x) (float, y, y) (float, z, z) (float, intensity, intensity)
(uint16_t, ring, ring) (float, time, time)
)
struct OusterPointXYZIRT {
PCL_ADD_POINT4D;
float intensity;
uint32_t t;
uint16_t reflectivity;
uint8_t ring;
uint16_t noise;
uint32_t range;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
} EIGEN_ALIGN16;
POINT_CLOUD_REGISTER_POINT_STRUCT(OusterPointXYZIRT,
(float, x, x) (float, y, y) (float, z, z) (float, intensity, intensity)
(uint32_t, t, t) (uint16_t, reflectivity, reflectivity)
(uint8_t, ring, ring) (uint16_t, noise, noise) (uint32_t, range, range)
)

在这段代码中,我发现PCL_ADD_POINT4D是pcl库中定义的联合。

#define PCL_ADD_UNION_POINT4D 
union EIGEN_ALIGN16 { 
float data[4]; 
struct { 
float x; 
float y; 
float z; 
}; 
};
#define PCL_ADD_EIGEN_MAPS_POINT4D 
inline pcl::Vector3fMap getVector3fMap () { return (pcl::Vector3fMap (data)); } 
inline pcl::Vector3fMapConst getVector3fMap () const { return (pcl::Vector3fMapConst (data)); } 
inline pcl::Vector4fMap getVector4fMap () { return (pcl::Vector4fMap (data)); } 
inline pcl::Vector4fMapConst getVector4fMap () const { return (pcl::Vector4fMapConst (data)); } 
inline pcl::Array3fMap getArray3fMap () { return (pcl::Array3fMap (data)); } 
inline pcl::Array3fMapConst getArray3fMap () const { return (pcl::Array3fMapConst (data)); } 
inline pcl::Array4fMap getArray4fMap () { return (pcl::Array4fMap (data)); } 
inline pcl::Array4fMapConst getArray4fMap () const { return (pcl::Array4fMapConst(data)); }

#define PCL_ADD_POINT4D 
PCL_ADD_UNION_POINT4D 
PCL_ADD_EIGEN_MAPS_POINT4D

我的问题是在代码的第三行,我认为PCL_ADD_POINT4D应该是PCL_ADD_POINT4D;. 如果PCL_ADD_INTENSITY的类型是union PCL_ADD_POINT4D(例如类型名;例如int a;),那么第15行代码对我来说仍然是有问题的。

我的第二个问题是什么是POINT_CLOUD_REGISTER_POINT_STRUCT ?是功能吗?你能告诉我一个关键字吗,这样我可以谷歌一下。

很抱歉愚蠢的问题…并提前感谢您的善意回答。

完整代码见https://github.com/TixiaoShan/LIO-SAM/blob/master/src/imageProjection.cpp#L5

这个宏

PCL_ADD_POINT4D

根据的定义,展开为

PCL_ADD_UNION_POINT4D 
PCL_ADD_EIGEN_MAPS_POINT4D

展开为

[...]
inline pcl::Vector3fMap getVector3fMap () { return (pcl::Vector3fMap (data)); } 
inline pcl::Vector3fMapConst getVector3fMap () const { return (pcl::Vector3fMapConst (data)); } 
inline pcl::Vector4fMap getVector4fMap () { return (pcl::Vector4fMap (data)); } 
inline pcl::Vector4fMapConst getVector4fMap () const { return (pcl::Vector4fMapConst (data)); } 
inline pcl::Array3fMap getArray3fMap () { return (pcl::Array3fMap (data)); } 
inline pcl::Array3fMapConst getArray3fMap () const { return (pcl::Array3fMapConst (data)); } 
inline pcl::Array4fMap getArray4fMap () { return (pcl::Array4fMap (data)); } 
inline pcl::Array4fMapConst getArray4fMap () const { return (pcl::Array4fMapConst(data)); }    

在类中定义方法后不需要;。简单示例

#define foo_method  void foo() {}
struct bar {
foo_method
};

预处理后的代码如下:

struct bar {
void foo() {}
};

要知道POINT_CLOUD_REGISTER_POINT_STRUCT是什么,您需要在代码库中搜索它的定义。可以使用和滥用宏来做最奇怪的事情。它真的可以是任何东西

不要将预处理器宏与实际代码混淆。

在这段代码中,我发现PCL_ADD_POINT4D是在pcl库中定义的联合。

PCL_ADD_POINT4D是一个预处理器符号,在代码中使用时,由预处理器根据联合的定义展开。这种区别是必要的,因为预处理器在实际编译开始之前运行。它仅仅是关于符号的文本替换。

最新更新