是否有良好的参数检查策略?

时间:2011-08-28 12:19:30

标签: c argument-passing

而不是使用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
    //
}

在我看来这是一个很好的方法,但在添加之前,我想知道有没有更好的方法呢?

提前致谢!

4 个答案:

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