c++ - 使用 c/c++ 宏禁用多行语句

标签 c++ c c-preprocessor

是否可以根据某些定义使用 c/c++ 预处理器禁用代码块,而无需使用 #ifdef#endif 检测代码?

 // if ENABLE_TEST_SONAR is not defined, test code will be eliminated by preprocessor
 TEST_BEGIN(SONAR)
   uint8_t sonar_range = get_sonar_measurement(i);
   TEST_ASSERT(sonar_range < 300)
   TEST_ASSERT(sonar_range > 100)
 TEST_END

功能等同于如下内容:

#ifdef TEST_SONAR
    serial_print("test_case sonar:\r\n");
    uint8_t sonar_range = get_sonar_measurement(i);
    serial_print("  test sonar_range < 300:%d\r\n", sonar_range < 300);
    serial_print("  test sonar_range > 100:%d\r\n", sonar_range > 100);
#endif TEST_SONAR

最佳答案

只能使用#ifdef#if 禁用多行,但可以使用宏禁用单行。注意多行可以用\

组合
#ifdef DOIT
#define MYMACRO(x) \
 some code \
 more code \
 even more \
#else
#define MYMACRO(x)
#endif

然后当您调用 MYMACRO 时,该代码将根据是否定义了 DOIT 而包含或不包含

这是最接近的,经常用于调试代码

编辑:一时兴起,我尝试了以下方法,它似乎有效(在 MSVC++ 和 g++ 中):

#define DOIT
#ifdef DOIT
#define MYMACRO(x) x
#else
#define MYMACRO(x)
#endif

void foo(int, int, int)
{
}

int main(int, char **)
{
    int x = 7;
MYMACRO(
if (x) 
return 27; 
for (int i = 0; i < 10; ++i) 
    foo(1, 2, 3);
)

}

关于c++ - 使用 c/c++ 宏禁用多行语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31192189/

相关文章:

c++在arduino中传递HIGH和LOW的 vector

C 套接字读取太多数据

c - 在 C 中实现通用链表库时的内存管理

c++ - 比较位(一次一个位置)

c++ - 在 C++ 中将字符串转换为 int 的问题

c++ - 定义数组 C/C++

c - 在宏函数中设置无效参数是否合法?

c++ - Facebook warpdrive 构建 - D 编程语言

c++ - C++ 中的 Tic-Tac-Toe 帮助,如何制作循环以便 Tic Tac Toe 游戏每次都会重复棋盘

c - 分段故障核心(已转储)