【发布时间】:2014-08-31 15:47:08
【问题描述】:
我正在用 C++ 为我的应用程序创建一个记录器类。此类具有将调试输出记录到文件的静态成员。我想创建一个可以以两种方式使用的宏:
LOG("Log some text")
which calls Logger::log(std::string)
-----或-----
LOG << "Log some text" << std::endl;
which calls Logger::getLogStream()
目标是包含 Logger.h 足以记录到文件,并且使用相同的语法完成,但如果您有其他建议,我并不特别喜欢宏。不幸的是,使用 Boost::PP 不是一种选择。
我有 looked around (see this comment),但没有发现任何关于区分对 LOG 和 LOG() 的调用。如何区分一个论点和没有论点?
【问题讨论】:
-
你不能。预处理器可能是编译器的一部分,但它并不遵循 C 或 C++ 语言的规则,它是一种完全不同的语言,具有不同的语法和不同的语义规则。
-
是的,我已经想到了,因为我搜索并没有找到任何方法。还有其他建议来实现这一点吗? Typedef、内联、宏或我可能错过的东西?
-
你可以定义一个类似函数的宏
LOG(X)和一个名为LOG的对象。不带括号的LOG形式不受类函数宏扩展的影响。也可以定义一个同时重载operator()和operator<<的函数对象。
标签: c++ macros c-preprocessor