是否可以用#define替换整行?

时间:2017-09-19 17:18:14

标签: c++ macros c-preprocessor

假设我有一个包含许多文件和许多cout的程序,出于调试目的,我想暂时禁用输出,但只能在一个文件中。

这只是出于好奇问题,我知道我不应该这样做来禁用输出,但我开始怀疑何时遇到这个问题,它只能正确显示我的意思。

我尝试创建一个#define宏,但我无法替换整行,只能替换一个符号(带参数)。

例如:

//some common header file
#ifdef DISABLE_OUTPUT
#define cout... void; //?? DK exactly what should i put here
#endif

//other file
#include "commons.h" //my macro
#define DISABLE_OUTPUT

void foo()
{
    ...
    cout << "blablabla" << 4 << "something" << endl; // should be removed
    ...
}

如果定义了DISABLE_OUTPUT,则整行应替换为void;(更好地清除该行)。

问题在于我不知道如何使用#define清除整行。

我可以使用任何“魔法”符号或技巧吗?

1 个答案:

答案 0 :(得分:3)

定义一个与标准库组件同名的宏是个坏主意,所以你根本不应该#define cout。我将假设你#define disableable_cout

最简单的答案是将其定义为:

#ifdef DISABLE_OUTPUT
#define disableable_cout if (false) cout
#else
#define disableable_cout cout
#endif

然后将cout中的foo行更新为:

disableable_cout << "blablabla" << 4 << "something" << endl;

哪个会扩展到这两个:

if (false) cout << "blablabla" << 4 << "something" << endl;

如果定义了DISABLE_OUTPUT,或者是:

cout << "blablabla" << 4 << "something" << endl;

如果未定义DISABLE_OUTPUT

然后,如果定义了DISABLE_OUTPUT,则跳过输出行;如果没有,它就会发生。

或者,您可以要求DISABLE_OUTPUT始终定义为0(不禁用)或1(禁用)。然后你可以使用一个单一的定义,如:

#define disableable_cout if (!DISABLE_OUTPUT) cout

请注意,任何一个选项都是脆弱的,就像大多数宏一样,但它应该适用于典型的情况。