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