我正在编写一些宏(是的,我知道它是邪恶的,但它有助于我制作更优化的代码),如下所示:
#define HUGGLE_DEBUG(debug, verbosity) if (Huggle::Configuration::HuggleConfiguration->Verbosity >= verbosity) \
Huggle::Syslog::HuggleLogs->DebugLog(debug, verbosity)
函数DebugLog(QString, unsigned int Verbosity = 1)
有可选参数Verbosity,我想在宏中也可选,所以我可以调用
HUGGLE_DEBUG("some debug text");
以及:
HUGGLE_DEBUG("more verbose text", 10);
有可能吗?注意:我在宏中使用第二个变量,但是如果我没有它,我可以将其替换为1
我的想法是从中创建一个可变参数宏,它可以这样工作:
#define HUGGLE_DEBUG(debug, ...) Syslog::HuggleLogs->DebugLog(debug, ##__VA_ARGS__)
哪个会起作用,但它不会使用我在第一个中做的优化
答案 0 :(得分:2)
看到你已经使用宏了,你可能不会介意一个非常糟糕的解决方案:
#define HUGGLE_DEBUG(...) \
if (Huggle::Configuration::HuggleConfiguration->Verbosity >= ((int)(bool)__VA_ARGS__)) \
Huggle::Syslog::HuggleLogs->DebugLog(__VA_ARGS__)
用一个参数调用时:
HUGGLE_DEBUG("abc")
// expands to
if (Huggle::Configuration::HuggleConfiguration->Verbosity >= ((int)(bool)"abc"))
Huggle::Syslog::HuggleLogs->DebugLog("abc")
(bool)"abc"
为true
,因此(int)(bool)"abc"
为1
。
使用两个参数调用时:
HUGGLE_DEBUG("abc", 10)
// expands to
if (Huggle::Configuration::HuggleConfiguration->Verbosity >= ((int)(bool)"abc", 10))
Huggle::Syslog::HuggleLogs->DebugLog("abc", 10)
(int)(bool)"abc", 10
使用逗号运算符,因此它的计算结果为10
。
但请 请,请考虑使用inline
功能。没有必要使用宏。
答案 1 :(得分:1)
还有Boost.Preprocessor的解决方案:
#define HUGGLE_DEBUG_1( debug ) HUGGLE_DEBUG_2( debug, 1 )
#define HUGGLE_DEBUG_2( debug, verbosity ) \
if( Huggle::Configuration::HuggleConfiguration->Verbosity >= verbosity) \
Huggle::Syslog::HuggleLogs->DebugLog(debug, verbosity)
#define HUGGLE_DEBUG( ... ) BOOST_PP_OVERLOAD(HUGGLE_DEBUG_,__VA_ARGS__) (__VA_ARGS__)
它比使用逗号运算符的方法更灵活,因为您可以使用任何默认参数,而不仅仅是1
。
仍然:使用内联函数(或Lambdas)。