Есть ли хорошая стратегия проверки аргументов? - PullRequest
2 голосов
/ 28 августа 2011

вместо проверки каждого аргумента входного указателя с 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 ]

6 голосов
/ 28 августа 2011

Вместо этого я бы использовал ASSERT - по крайней мере, в вашей версии для отладки.

Кроме того, как сказал Джордж - не читается и ясно, что он возвращает 0.

2 голосов
/ 28 августа 2011

Макросы обычно не одобряются, но иногда чрезвычайно полезны.Но макросы, которые имеют «скрытые» побочные эффекты (такие как возврат), потенциально опасны, потому что их трудно обнаружить.По крайней мере, подумайте о переименовании вашего макроса, чтобы сделать это явным, например, CHECK_ARG_AND_RETURN_IF_INVALID.Это многословно, но трудно пропустить.

1 голос
/ 28 августа 2011

В вашей функции напишите

assert_or_return(first_arg != NULL);
assert_or_return(second_arg != NULL);

Определите assert_or_return, чтобы в отладочной версии он запускал отладчик (вызывая прерывание), а в версии выпуска регистрировал ошибку и возвращал (какты хочешь сделать).Я предполагаю, что вы уверены, что возвращение из функции, когда один из аргументов равен 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
0 голосов
/ 28 августа 2011

Может быть, вы можете утверждений.Взгляните на assert.h .

...