【发布时间】:2016-01-26 15:58:50
【问题描述】:
我正在尝试为我自己的项目编写我自己的自定义断言。本项目将使用 c++11 编写。
断言必须具有以下品质:
它必须作为表达式保存并且是可赋值的。
例如。我应该可以写出这样的代码int x = custom_assert(1/y);
必须重载才能接受带有消息和不带消息的断言。
E.g int x = custom_assert(1/y, "Error divide by zero"); 这段代码和上面的代码都是可编译和可接受的。
在发布模式下必须没有副作用
例如。 int x = custom_assert(1/y); 在发布模式下会变成int x = 1/y;。
最重要的是,它必须在断言的特定点中断。它将使用__debugbreak() 作为其评估表达式的一部分。
以下是我的尝试:
#include <string>
bool DoLog(std::string msg, std::string file, int line); //Prints to std::cerr and returns HALT macro
#if defined(_DEBUG) || defined(DEBUG)
#define HALT true
#define NT_ASSERT_BASE(x, msg) (!(x) && DoLog((msg), __FILE__, __LINE__) && (__debugbreak(),1))
#else
#define HALT false
#define NT_ASSERT_BASE(x,msg) (x)
#endif//debug/release defines
//--- Can't implement these until I can return the expression ---
//#define GET_MACRO(_1,_2,_3,NAME,...) NAME
//#define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__)
#define NT_ASSERT(expression, msg) NT_ASSERT_BASE(expression,msg)
如您所见,我的自定义断言在 2 个方面失败,即被保留为表达式和可分配,以及重载(在我弄清楚如何将其保留为表达式之前,我无法实现。
总而言之,我可能是在追星,这个宏实际上可能是不可能做出来的。 (我希望不是这样)
非常感谢。
【问题讨论】:
-
被限制使用c++11/14?
-
项目允许使用 C++11
-
顺便说一下,在发布模式下保留的类断言表达式(减去实际断言)我相信称为"verify" expressions,尽管这可能是一个微软主义。总的来说,我认为
assert代码保留在发布版本中会让人感到惊讶。 -
这需要澄清一下。给定
x = custom_assert(1/y);,触发“断言”的条件是什么?您的示例表明它被零除,但您的尝试表明它只是表达式评估为 0。
标签: c++ c++11 expression assert