只想编译 if-else 中的 if 语句
Posted
技术标签:
【中文标题】只想编译 if-else 中的 if 语句【英文标题】:Want to compile only if statement in if-else 【发布时间】:2021-11-22 17:04:53 【问题描述】:我正在开发一个项目,该项目必须同时在 ros melodic (ubuntu 18.04) 和 ros noetic(ubuntu 20.04) 上运行。所以在这样做的同时,我在我的代码中做了一个 if-else 语句,
if(distro=="noetic")
...do this
else
...do this
问题基本上出现了,noetic 和 melodic 支持不同版本的点云库(PCL),这也使得它们在初始化方式上有所不同。因此,当我在 if 语句和 else 语句中放入 PCL 初始化(提示支持的方式)时,我放入了旋律初始化方式。我希望编译器(我使用的 catkin_make 命令)只编译 if 语句,但它也编译 else 语句,这会给出错误,因为 noetic 不支持旋律初始化方式。应该怎么走?
【问题讨论】:
考虑到 PCL 依赖的不同,如果你想同时支持旋律和音符,你不应该尝试通过编译器来实现。解决这个问题的标准 ROS 方法是有一个单独的旋律和意念分支。 除此之外,这对于if constexpr (...)
来说可能是一个很好的用例,尽管这可能不会阻止编译器对另一个分支进行“事实检查”。也许您可以将初始化提取到一个单独的模板函数中并使用SFINAE(通过std::enable_if
或使用decltype(something)
返回值,其中something
仅在两个库之一中有意义)过滤掉重载/没有意义的专业化。
【参考方案1】:
使用预处理器宏。这需要在编译前处理。预处理器宏 #ifdef
和 #ifndef
将检查符号表中是否存在令牌(检查您的操作系统的文档以查看是否有定义的令牌),然后跳到相应的 if/else 部分。
#ifdef NOETIC_DISTRO
//Code for noetic distro
#endif
#ifdef OTHER_DISTRO
//Code for other distro
#endif
【讨论】:
我认为任何 ROS 头文件实际上都不会定义像“NOETIC_DISTRO”这样的东西。尽管您可以手动定义它们,但我认为正确的解决方案是使用 ros/common.h 中存在的“ROS_VERSION_*”定义:answers.ros.org/question/9562/…以上是关于只想编译 if-else 中的 if 语句的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用“if-else”语句会在看似相同的三元运算符构造不会产生 TypeScript 编译器错误?
.NET(C#):分析IL中的if-else,while和for语句并用Emit实现