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

时间:2014-06-18 12:45:57

标签: c++ macros

我正在编写一些宏(是的,我知道它是邪恶的,但它有助于我制作更优化的代码),如下所示:

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

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

2 个答案:

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