只想编译 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实现

java if-else语句中的if条件后如果不加大括号能执行几句话?

DB2/400 中的 if-else 语句

if-else 语句中的 GIF

减少 Java 中的 if-else 语句