0

assert() 函数可以打印错误以及错误发生的位置,但它也会中止该函数。

我想要一个 assert() 函数而不中止。我只希望打印错误,发生错误的文件的名称等。

C中有这样的API或源代码片段吗?

谢谢!

4

4 回答 4

3

Cunit 有一个断言,要么是致命的(退出),要么不是(将继续)。

http://cunit.sourceforge.net/doc/writing_tests.html#tests

于 2013-05-13T14:40:57.363 回答
2

因此,如果我没看错,您的问题基本上是“如何打印文件名和行号?”

简单,使用

__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

于 2013-05-13T15:31:02.327 回答
2

首先让我们看看断言是什么

文件说

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

希望这可以帮助

于 2013-05-13T14:53:03.400 回答
-3

这称为异常,它是一种在 C++ 等语言中可用的构造,具有优化的实现。除了例外,您可以在任何地方退出任何函数,并在调用堆栈的任何位置结束,而不会发生内存泄漏。当然,这将要求您的代码是异常安全的。

在 C 中,您需要修改goto, setjmp, longjmp,这基本上是 C++ 异常的错误版本。

参见例如http://en.cppreference.com/w/cpp/language/exceptions

于 2013-05-13T14:41:29.493 回答