寻找一个API/函数,它类似于C中没有中止的assert()

寻找一个API/函数,它类似于C中没有中止的assert(),c,assert,C,Assert,assert()函数可以打印错误以及错误发生的位置,但也会中止该函数 我想要一个assert()函数而不中止。我只希望打印错误、发生错误的文件名等 C语言中有这样的API或源代码片段吗 谢谢 Cunit有一个断言,该断言要么是致命的(退出),要么不是致命的(将继续) Cunit有一个断言,该断言要么是致命的(退出),要么不是致命的(将继续) 这称为异常,它是一种在C++语言中可用的优化结构。除了异常情况,您可以在任何地方退出任何函数,并在调用堆栈的任何位置结束,而不会出现任何内存泄漏。当然,这

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

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

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


谢谢

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


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


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

<>在C中,您需要用<代码> Goto < /C> >,>代码> SETJMP ,<代码> LojJMP < /C> >,这基本上是C++异常的坏版本。


参见

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

<>在C中,您需要用<代码> Goto < /C> >,>代码> SETJMP ,<代码> LojJMP < /C> >,这基本上是C++异常的坏版本。


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

文件上说

assert()作为宏实现

现在让我们看看assert的实际实现 像这样的

((x = 0) ? (void) (0) : __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)
}
在你的情况下,你可能不想要下面的表达式

__assert_fail ("x = 0", "t.c", 9, __PRETTY_FUNCTION__))
现在我们能做的是

像这样的

((x = 0) ? (void) (0) : __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)
}

希望这有帮助首先让我们看看断言是什么

文件上说

assert()作为宏实现

现在让我们看看assert的实际实现 像这样的

((x = 0) ? (void) (0) : __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)
}
在你的情况下,你可能不想要下面的表达式

__assert_fail ("x = 0", "t.c", 9, __PRETTY_FUNCTION__))
现在我们能做的是

像这样的

((x = 0) ? (void) (0) : __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)
}

希望这有帮助,如果我读对了,你的问题基本上是“如何打印文件名和行号?”

简单,实用

__FILE__, __LINE__
如果需要,可以创建自己的宏,如

#define MY_ASSERT(x) if(x) printf("Assertion! Line: %d File: %s \n", __LINE__, __FILE__)

还有其他有用的预定义宏

如果我读对了,你的问题基本上是“如何打印文件名和行号?”

简单,实用

__FILE__, __LINE__
如果需要,可以创建自己的宏,如

#define MY_ASSERT(x) if(x) printf("Assertion! Line: %d File: %s \n", __LINE__, __FILE__)

还有其他有用的预定义宏

嗯,断言的目的通常是发现“不可能”的情况(即违反代码其余部分所做的假设),对于这种情况,唯一明智的做法通常是中止操作(=情况完全出乎意料,代码无法恢复);如果您想继续,那么这不是断言,它可能是某种检查,运行一些恢复代码/调用堆栈中捕获的异常/日志中的消息或其他内容。您应该更好地描述情况以获得有意义的建议。似乎这可以是一个简单的宏来进行测试并打印/记录消息。嗯,断言的目的通常是发现“不可能”的情况(即违反代码其余部分所做的假设),唯一明智的做法通常是中止操作(=情况完全出乎意料,代码无法恢复);如果您想继续,那么这不是断言,它可能是某种检查,运行一些恢复代码/调用堆栈中捕获的异常/日志中的消息或其他内容。您应该更好地描述情况以获得有意义的建议。似乎这可以是一个简单的宏来进行测试并打印/记录消息。
printf('something')
,我只是对这里的
something
感兴趣。assert()将在此处填充某些内容。在您的情况下,程序员必须填充字符串。
printf('something')
,我只是对这里的
something
感兴趣。assert()将在此处填充某些内容。在您的情况下,程序员必须填充字符串。