Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何制作C++;检查条件的宏,如果不满足则打印错误并执行用户块?_C++_C Preprocessor - Fatal编程技术网

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