如何注释掉多行宏中的代码块?

How to comment out chunk of code in multi-line macro?

我在 C++ 中有一个复杂的多行宏代码(处理一些几何图形并在 RT 中计算其物理属性),它被多次使用并且无法转换为函数(没有巨大的 space 和性能命中)。问题是我有时需要在禁用部分代码中配置代码(在编译时特定 tasks/machines),如下所示:

#define some_macro \
 bla;              \
 bla;              \
 if (0)            \
  {                \
  bla;             \
  bla;             \
  bla;             \
  }                \
 bla; 

如您所见,由于重复使用宏,这会导致多次 unreachable code 警告。使用 /* */ 注释是可能的,但由于需要更改每一行代码,因此对于管理此类代码(至少对我而言)非常不利。

我能想到的唯一其他可行的选择是使用类似这样的宏:

#define my_disable
#define some_macro  \
 bla;               \
 bla;               \
 #ifndef my_disable \
  bla;              \
  bla;              \
  bla;              \
 #endif             \
 bla; 

#undef my_disable

或者以相同的方式使用一些易失性开关变量:

volatile bool on=true;
#define some_macro \
 bla;              \
 bla;              \
 if (on)           \
  {                \
  bla;             \
  bla;             \
  bla;             \
  }                \
 bla; 

我宁愿不要丢失多行代码格式,因为宏是至关重要的,而且非常复杂,如果没有它,及时将无法读取和管理。将此宏分离为更小的宏也是如此。

是否有任何其他选项不需要更改代码块的所有行或在每个代码块基础上创建 macro/variable?

另一个可能更简单的解决方案是关闭相关代码部分的警告,让其余代码照常处理警告,但我不知道语法。所以替代问题是:

如何仅对部分源代码禁用 [C++ Warning] W8066 Unreachable code

我受困于旧的 BDS2006 C++ 编译器,所以新的语言怪癖无济于事。

How to disable [C++ Warning] W8066 Unreachable code for just part of a source code?

您可以用 #pragma warn 语句包装代码:

#pragma warn -8066 // disable W8066 warnings
<code>
#pragma warn .8066 // restore W8066 warnings back to default

否则,我建议只复制宏,注释掉原始宏,然后根据需要修改副本以删除所需的代码。

/*
#define some_macro \
 bla;              \
 bla;              \
 if (0)            \
  {                \
  bla;             \
  bla;             \
  bla;             \
  }                \
 bla; 
*/
#define some_macro \
 bla;              \
 bla;              \
 bla; 

或者,您可以在原始宏中注释掉所需的代码:

#define some_macro \
 bla;              \
 bla;              \
 //if (0)            \
 // {                \
 // bla;             \
 // bla;             \
 // bla;             \
 // }                \
 bla;