assert() 函数可以打印错误以及错误发生的位置,但它也会中止该函数。
我想要一个 assert() 函数而不中止。我只希望打印错误,发生错误的文件的名称等。
C中有这样的API或源代码片段吗?
谢谢!
Cunit 有一个断言,要么是致命的(退出),要么不是(将继续)。
因此,如果我没看错,您的问题基本上是“如何打印文件名和行号?”
简单,使用
__FILE__, __LINE__
如果需要,请创建自己的宏,例如
#define MY_ASSERT(x) if(x) printf("Assertion! Line: %d File: %s \n", __LINE__, __FILE__)
还有其他有用的预定义宏。http://gcc.gnu.org/onlinedocs/gcc-3.1/cpp/Standard-Predefined-Macros.html
首先让我们看看断言是什么
文件说
assert() 被实现为宏
现在让我们看看这样的断言的实际实现
((x = 0) ? (void) (0) : __assert_fail ("x = 0", "t.c", 9, __PRETTY_FUNCTION__));
好吧,在您的情况下,您可能不想要下面的表达式
__assert_fail ("x = 0", "t.c", 9, __PRETTY_FUNCTION__))
现在我们可以在这里做的是
像这样的东西
#define MY_ASSERT(expr) \
(expr ? (void) (0) : printf("something"));
int main(int argc, char *argv[]){
MY_ASSERT(argc == 0)
}
希望这可以帮助
这称为异常,它是一种在 C++ 等语言中可用的构造,具有优化的实现。除了例外,您可以在任何地方退出任何函数,并在调用堆栈的任何位置结束,而不会发生内存泄漏。当然,这将要求您的代码是异常安全的。
在 C 中,您需要修改goto
, setjmp
, longjmp
,这基本上是 C++ 异常的错误版本。