在c中有一个非致命的等同于断言吗?

时间:2013-05-26 10:40:59

标签: c assert

我想编写assert语句但不会中止该程序。所以也许使用与assert()完全相同的语法,但称为expect()。当然我可以编写自己的,但断言非常聪明(例如,它不仅知道文件和行号,而且甚至知道不是TRUE的表达式)。 我当然可以深入了解库和C-v / C-c解决方案。 但这是一个非常明显的通用请求,我无法相信已经没有一个好的解决方案了。当然这里应该很容易找到...

3 个答案:

答案 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 

Live demo.

答案 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

此版本

  • 写给stderr,而不是stdout
  • 可以像使用NDEBUG宏
  • 的assert()一样禁用

它看起来尽可能像assert()消息,但当然它没有断言在其他参数方面的灵活性。

我不明白为什么强制使用分号是有用的 - 因为如果有一个分号是有效的,如果没有它仍然有效!

一些更聪明的解决方案,比如尝试......赶上assert()是我希望得到的答案!