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