我正在编写一个将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 ++中的宏是否可以实现这一点。如果可能请提供示例。
答案 0 :(得分:2)
正如所写,您的MYLOG宏版本显然不会扩展为有效的C ++代码。
以下替代方案有更好的机会按预期工作;但它还取决于LOG1
和LOG2
究竟是什么
#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。