而不是使用if
条件if( in != NULL )
检查每个输入指针参数,是否有更好的方法来执行此操作。一种方法是创建一些宏,比如
#define CHECK_ARG(x) if(!(x)) { return 0; }
在代码中它看起来像这样
int some_func( int * first_arg, int * second_arg )
{
CHECK_ARG( first_arg );
CHECK_ARG( second_arg );
// some operations
//
}
在我看来这是一个很好的方法,但在添加之前,我想知道有没有更好的方法呢?
提前致谢!
答案 0 :(得分:6)
我会在那里使用一些ASSERT
- 至少在你的调试版本中。
此外,乔治所说的 - 它不可读且清晰,它返回0
。
答案 1 :(得分:2)
宏通常不赞成,但有时非常有用。但是具有“隐藏”副作用(如返回)的宏具有潜在的危险性,因为它们很难被发现。至少考虑重命名宏以使其明确,例如CHECK_ARG_AND_RETURN_IF_INVALID
。它很冗长,但很难错过。
答案 2 :(得分:1)
在你的函数中写
assert_or_return(first_arg != NULL);
assert_or_return(second_arg != NULL);
定义assert_or_return,以便在调试版本中它将启动调试器(通过调用abort),并在发布版本中它将记录错误并返回(如您所愿)。我假设您确信当其中一个参数为NULL时从函数返回将比应用程序的生产版本中的损害更好。如果提前返回,您将不可挽回地破坏用户的数据或导致熔炉爆炸,最好提前终止,可能使用自定义错误消息。
以下示例说明了如何实施您的想法。
#ifdef NDEBUG
#define assert_or_return(expr) do { \
if (!(expr)) { \
fprintf(logfile, "Assertion %s in %s(%d) failed\n", #expr, __FILE__, __LINE__); \
return 0; \
} \
} while(0)
#else
#define assert_or_return(expr) do { \
if (!(expr)) { \
fprintf(stderr, "Assertion %s in %s(%d) failed\n", #expr, __FILE__, __LINE__); \
abort(); \
} \
} while(0)
#endif
答案 3 :(得分:0)
也许你可以断言。看看assert.h。