在C中实现try / catch的有效方法

时间:2013-07-09 23:04:56

标签: c try-catch

我想在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

3 个答案:

答案 0 :(得分: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是一个通常由编译器在“发布”(或“非调试”)版本中定义的定义,因此我们在此处使用“仅在实际有意义时执行此操作”。

答案 1 :(得分:1)

答案 2 :(得分: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)