我在使用#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/