gpt4 book ai didi

c++ - C 中不明确的定义指令

转载 作者:太空狗 更新时间:2023-10-29 21:23:05 24 4
gpt4 key购买 nike

我正在查看一些代码 (PCL) 并找到了这个定义指令:

#define PCL_FEATURE_POINT_TYPES \
(pcl::PFHSignature125) \
(pcl::PFHRGBSignature250) \
(pcl::PPFSignature) \
(pcl::PPFRGBSignature) \
(pcl::NormalBasedSignature12) \
(pcl::FPFHSignature33) \
(pcl::VFHSignature308) \
(pcl::Narf36)

有人可以向我解释这是在做什么吗(并可能提供对此功能的引用?)。这样的东西什么时候有用?

最佳答案

哦,天哪,这搞砸了。

精简版

它是预处理器的一个类似列表的结构(Boost PP 中的 "sequence"),由 Boost Preprocessor Macros 使用。 (=黑魔法);所有 PCL_*_POINT_TYPES 宏都将与 PCL_INSTANTIATE 宏一起使用,以(通过复杂的方式)为序列中给定的类型提供某些模板的显式实例化。

长版

免责声明:我对 PCL 没有任何具体的专业知识,我只是四处搜寻;所有对代码的引用都与 PCL SVN r8781 相关。

它似乎是这样工作的:

  • 所有 PCL_*_POINT_TYPES 都是旨在与 PCL_INSTANTIATE 一起使用的宏宏观;

    #define PCL_INSTANTIATE (TEMPLATE, POINT_TYPES) BOOST_PP_SEQ_FOR_EACH(PCL_INSTANTIATE_IMPL, TEMPLATE, POINT_TYPES)
  • 这个宏使用了 Boost 宏 BOOST_PP_SEQ_FOR_EACH"sequence" 中提取每个元素,并将其提供给 PCL_INSTANTIATE_IMPL:

    #define PCL_INSTANTIATE_IMPL (r, TEMPLATE, POINT_TYPE) BOOST_PP_CAT(PCL_INSTANTIATE_, TEMPLATE)(POINT_TYPE)
  • PCL_INSTANTIATE_IMPL 反过来使用 BOOST_PP_CATPCL_INSTANTIATE_PCL_INSTANTIATETEMPLATE 参数连接起来。并将点类型(即从 PCL_*_POINT_TYPES 宏列表中提取的点类型)放在括号中。

所以,写的时候

PCL_INSTANTIATE(Search, PCL_POINT_TYPES)

(取自 here ,第 43 行)

实际发生的是

PCL_INSTANTIATE_Search(pcl::PointXYZRGBA) PCL_INSTANTIATE_Search(pcl::PointXYZRGB) PCL_INSTANTIATE_Search(pcl::PointXYZRGBL) PCL_INSTANTIATE_Search(pcl::PointXYZRGBNormal) PCL_INSTANTIATE_Search(pcl::PointSurfel)

现在,PCL_INSTANTIATE_Search(及其所有兄弟 PCL_INSTANTIATE_T,其中 T 是 PCL_INSTANTIATE 的参数)依次是 other 宏,在别处定义。此类宏通常会扩展为显式模板实例化:

#define PCL_INSTANTIATE_Search(T) template class PCL_EXPORTS pcl::search::Search<T>;

(来自 here,第 208 行;注意宏末尾的分号)

最后变成:

template class PCL_EXPORTS pcl::search::Search<pcl::PointXYZRGBA>;
template class PCL_EXPORTS pcl::search::Search<pcl::PointXYZRGB>;
template class PCL_EXPORTS pcl::search::Search<pcl::PointXYZRGBL>;
template class PCL_EXPORTS pcl::search::Search<pcl::PointXYZRGBNormal>;
template class PCL_EXPORTS pcl::search::Search<pcl::PointSurfel>;

(添加换行符)

因此,整个事情归结为一系列显式模板实例化。


再次总结一下:PCL_*_POINT_TYPES 是要与PCL_INSTANTIATE 一起使用的类型的“预处理器列表”; PCL_INSTANTIATE 获取列表,并使用奇怪的魔法为列表中的所有类型实例化与指定后缀相关的模板(例如,在本例中为 Search)。

所以,AFAICT,这件事的重点是提供一种简洁的方法来显式实例化所有指定类型的模板类。我没有进一步看,但我想这样做是为了避免在使用该库的代码中需要“正常”(“当场”)模板扩展,可能是为了加快编译时间,限制可能的模板仅扩展到那些确定的类型,以将它们保存在共享库中(以减小客户端可执行文件的大小),或者用于甚至不同的东西。

关于c++ - C 中不明确的定义指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19106280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com