我在使用#define时遇到麻烦。由于某种原因,它不会检查语句中的所有参数。

THROW_AND_LOG(Foo::Initialize() && Bar::Initialize() && FooBar::Initialize(), "Something() could not Initialize singletons.");


由于某种原因,它仅初始化Foo,然后退出该语句。它不会抛出或记录。

然而

THROW_AND_LOG((Foo::Initialize() && Bar::Initialize() && FooBar::Initialize()), "Something() could not Initialize singletons.");


出于某种原因工作正常。 (将所有支票包裹在括号中)。

我将把所有内容移到其自己的单独行上,以解决此问题,因为它不是一开始的最佳代码。但是我很好奇为什么它不执行所有语句。

这是定义:

#define THROW_AND_LOG(x, message) if(!x) { throw std::runtime_error(message);              \
    LOG::v1::MessageSender messageSender("log");                                           \
    LOGGING_ERROR(messageSender,message);}

最佳答案

用宏定义

#define THROW_AND_LOG(x, message) if(!x) { throw std::runtime_error(message);              \
    LOG::v1::MessageSender messageSender("log");                                           \
    LOGGING_ERROR(messageSender,message);}


调用

THROW_AND_LOG(Foo::Initialize() && Bar::Initialize() && FooBar::Initialize(), "Something() could not Initialize singletons.");


产生条件

if(!Foo::Initialize() && Bar::Initialize() && FooBar::Initialize())


相当于

if((!Foo::Initialize()) && Bar::Initialize() && FooBar::Initialize())




一个好的解决方法是用一个函数替换宏:

void throw_and_log_if(
     const bool          condition,
     const Location&     location,
     const string&       message )
{
    LOG::v1::MessageSender messageSender( "log" );
    LOGGING_ERROR( messageSender, message ); }
    throw std::runtime_error( message );
}


其中,Location是表示文件和行号的某种类,您可以通过__FILE____LINE__宏进行选择。

我自由地修复了导致无法执行日志记录的错误。



短期更简单的解决方法是在宏的条件下在x周围使用括号。

如果选择了该选项,请记住要修复宏中的错误。

关于c++ - #定义不执行所有参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29108422/

10-17 02:14