繁体   English   中英

C ++在可变参数宏中使用了许多参数(实现可选参数)

[英]C++ use a number of arguments in variadic macro (implementing optional argument)

我正在写一些宏(是的,我知道这是邪恶的,但它有助于我制作更优化的代码),看起来像这样:

#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__)

哪个会工作,但它会有点不使用我在第一个中做的优化

看到你已经使用了宏,你可能不会介意一个非常hacky的解决方案:

#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函数。 没有必要为此使用宏。

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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM