C++ 如何制作C++;检查条件的宏,如果不满足则打印错误并执行用户块?
我想做一个类似宏的断言,可以这样使用C++ 如何制作C++;检查条件的宏,如果不满足则打印错误并执行用户块?,c++,c-preprocessor,C++,C Preprocessor,我想做一个类似宏的断言,可以这样使用 CHECKED_LOG(window != nullptr, "Window must be initialized") { DoSomethingCleanupFunction(); return false; } 这应该扩展到 if (!(EXPR)) { LOG_MESSAGE("Error: window != nullptr : " + MSG); { /* user blo
CHECKED_LOG(window != nullptr, "Window must be initialized")
{
DoSomethingCleanupFunction();
return false;
}
这应该扩展到
if (!(EXPR))
{
LOG_MESSAGE("Error: window != nullptr : " + MSG);
{ /* user block */ }
}
有没有一种方法可以做到这一点,而不需要将源代码过度复杂化到某些类中,这些类使用RAII调用所有逻辑,并且不需要双重调用!(EXPR)
?我也希望它看起来很自然,而不是
CHECKEDLOG(...)
Logic();
} // <---- closing brace with opening one
以及扩张
bool Initialize()
{
window = InitWindow();
if (! (window != nullptr))
{
LOG_ERROR("window != nullptr", "Couldn't initialize window");
Stop();
return false;
}
inputHandler = InitInputHandler();
if (! (inputHandler != nullptr))
{
LOG_ERROR("inputHandler != nullptr", "Couldn't initialize input handler");
Stop();
return false;
}
}
有没有一种方法可以做到这一点,而不让源代码与某些类过度复杂化,这些类使用RAII调用所有逻辑,并且不需要双重调用!(EXPR)
将LOG_消息
放入if
中,使用逗号运算符计算为true
#define CHECKED_LOG(EXPR, MSG) \
if (!(EXPR) && (LOG_MESSAGE("Error: " #EXPR " : " + MSG), 1))
我会将这个宏命名为IF NOT\u THEN\u LOG
或类似的名称,首先让开发人员知道它是IF
,然后-CHECKED
是一个形容词,这里没有对象,EXPR
是要做的事情,所以你可以在这个表达式上IF
总的来说,这种宏有一种恐惧感。它们隐藏了一个流控制语句,它们通常会导致更复杂的代码,并最终变成一个意大利面条式的代码。Lambda、RAII和异常处理被发明到该语言中,因为使用它们更简单、更清晰、更安全。你想要什么是模棱两可的。你能展示一些你想要的代码吗?你需要这样的语法吗?为什么不使用lambda表达式?为什么不使用异常处理?@ HrgGOT——如果代码中有大量的Test/catch块,则不是编写惯用的C++(大多数都应该是异常中立的,如果抛出异常,则不关心单向或其他方式)。RAII通常使实现这一点变得非常简单。一种方法是:将块作为宏参数嵌入。为什么不改用内联函数呢?看起来不错,我一定会试试的
#define CHECKED_LOG(EXPR, MSG) \
if (!(EXPR) && (LOG_MESSAGE("Error: " #EXPR " : " + MSG), 1))