假设我有一个包含许多文件和许多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
清除整行。
我可以使用任何“魔法”符号或技巧吗?
答案 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
请注意,任何一个选项都是脆弱的,就像大多数宏一样,但它应该适用于典型的情况。