我想在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
答案 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)
您可以使用set jump和longjump
阅读此http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html
你也可以使用goto statment
答案 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)