为c ++流创建宏

时间:2016-03-03 04:06:57

标签: c++ macros

我正在编写一个将std流作为参数获取的宏。例如

file.h

int enable = 0;
#define MYLOG(hanlde) \
    if (enable==0) { LOG1(handle) } \
    else { LOG2(handle) }

file.cpp

MYLOG(handle) << "Test log msg";

预处理器执行后的预期结果必须是

LOG1(handle) << "Test log msg"; // if handle = 0
LOG2(handle) << "Test log msg"; // if handle = 1

c ++中的宏是否可以实现这一点。如果可能请提供示例。

2 个答案:

答案 0 :(得分:2)

正如所写,您的MYLOG宏版本显然不会扩展为有效的C ++代码。

以下替代方案有更好的机会按预期工作;但它还取决于LOG1LOG2究竟是什么

#define MYLOG(handle) (enable == 0 ? LOG1(handle):LOG2(handle))

答案 1 :(得分:2)

如上所述,宏不起作用。您需要使用以下内容:

#define MYLOG(hanlde) \
    (enable == 0 ? LOG1(handle) : LOG2(handle))

话虽如此,您可以使用同样有效的inline函数。

inline std::ostream& MYLOG(handle_type handle)
{
    return (enable == 0 ? LOG1(handle) : LOG2(handle))
}

简单inline函数与现代编译器的宏一样有效。由于其他原因,它们也更好。请参阅Inline functions vs Preprocessor macros