我想编写assert语句但不会中止该程序。所以也许使用与assert()完全相同的语法,但称为expect()。当然我可以编写自己的,但断言非常聪明(例如,它不仅知道文件和行号,而且甚至知道不是TRUE的表达式)。 我当然可以深入了解库和C-v / C-c解决方案。 但这是一个非常明显的通用请求,我无法相信已经没有一个好的解决方案了。当然这里应该很容易找到...
答案 0 :(得分:9)
这是因为assert
是预处理器宏,因此可以使用__LINE__
和__FILE__
宏,因为整个宏调用会扩展为一行。
您可以轻松制作自己的:
#define expect(value, message) \
do \
{ \
if (!(value)) \
{ \
fprintf(stderr, "%s failed in %s:%d\n", #value, __FILE__, __LINE__); \
} \
} while(0)
答案 1 :(得分:2)
不,没有这样的事情。但是,将其编写为:
非常容易#define expect( chk ) \
if (!(chk)) \
printf("Assertion (%s) failed %s at line %d ", #chk, __FILE__,__LINE__);
这个测试:
int main()
{
expect(0);
expect(1);
return 0;
}
将打印第一个失败的断言:
Assertion (0) failed t.c at line 8
答案 2 :(得分:2)
归功于BЈовић
#ifdef NDEBUG
#define expect(chk) ((void *)0)
#else
#define expect(chk) (chk ? (void) (0) : fprintf(stderr,"%s:%d %s: expectation (%s) failed.\n", __FILE__ , __LINE__ , __func__ , #chk))
#endif
此版本
它看起来尽可能像assert()消息,但当然它没有断言在其他参数方面的灵活性。
我不明白为什么强制使用分号是有用的 - 因为如果有一个分号是有效的,如果没有它仍然有效!
一些更聪明的解决方案,比如尝试......赶上assert()是我希望得到的答案!