0

我想在 C 中执行以下操作:

doSomthing(test_arg1); // first time
check_if_everything_good();

doSomething(test_arg2); // second time
check_if_everything_good();

doSomething(test_arg3); // third time
check_if_everything_good();

这个想法是,在我调用 doSomething() 之后,我想通过调用 check_if_everything_good() 来确保函数调用没有破坏其他任何东西。如果 doSomething() 损坏了某些东西, check_if_everything_good() 在第二次 doSomething() 调用之前返回。

但是,我想避免每次在 doSomething() {check_if_everything_good 很昂贵}之后调用 check_if_everything_good()。有没有办法可以在 C 中有效地实现这一点?可能类似于 java 中的 try/catch

4

3 回答 3

1

你可以使用 set jump 和 longjump

阅读此http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html

你也可以使用 goto 语句

http://www.roseindia.net/c-tutorials/c-goto-statement.shtml

于 2013-07-10T10:14:42.200 回答
1

假设这check_if_everything_good仅在开发环境中用于调试/诊断目的,那么您可以执行以下操作:

#ifndef NDEBUG
#define check_if_everything_good() do_check_if_everything_good()
#else
#define check_if_everything_good()
#endif

NDEBUG是一个通常由编译器在“发布”(或“非调试”)构建中定义的定义,所以我们在这里使用它来“仅在它真正有意义时才这样做”。

于 2013-07-09T23:32:37.427 回答
0

如果您想要的是能够编译出生产代码的检查,那么 Mats 的建议可以正常工作。不创建自己的宏的等效解决方案是简单地将检查函数更改为返回 0 表示失败,返回非零表示成功,并用assert().

assert(check_if_everything_good());

如果您希望有时但不总是执行检查,因为它会影响性能,您可以使用随机抽样。在这种情况下,它只是意味着您调用rand(),如果返回值在某个范围内,则执行检查,否则跳过检查。

#define maybe_check_everything() \
    do { \
        if (CHECK_ALWAYS || (CHECK_THRESHOLD ? rand() < CHECK_THRESHOLD : 0)) \
            check_if_everything_good(); \
    } while (0)
于 2013-07-10T09:58:02.073 回答