У меня есть 2 макроса-оболочки для утверждения входных параметров функции:
/**
* @brief An assert wrapper with no value return in case assert fails.
* @param x_: value to test for being non zero.
*/
#define UTIL_ASSERT_VOID(x_) \
assert_param(x_); \
if (!x_) \
return; \
/**
* @brief An assert wrapper with a value return in case assert fails.
* @param x_: value to test for being non zero.
*/
#define UTIL_ASSERT_VAL(x_, ret_) \
assert_param(x_); \
if (!x_) \
return ret_; \
Первый используется в функциях, возвращающих void, а второй — в функциях, возвращающих non-void. Мне было интересно, либо в C11 (или ранее) есть механизм, позволяющий использовать только один макрос с переменным количеством параметров. В зависимости от того, сколько параметров предоставлено макросу (1 или 2), будет скомпилирован return
или return ret_
.
assert(param1); assert(param2); ...
. Как имеет смысл возвращаться из функции, когда сработало утверждение? - person Lundin   schedule 11.03.2019void
, и другой, возвращающейint
, а будет один тип функции, возвращающийerr_t
или что-то еще. Кроме того, в голых металлических системах следует избегать использования assert(). - person Lundin   schedule 11.03.2019err_t
, поэтому вся эта тема не имеет смысла. И после того, как вы реализовалиerr_t
, нет смысла раздельно обрабатывать в режиме отладки и релиза, так как вы всегда будете обнаруживать ошибки независимо от сборки. Вы можете заменить макрос наif(param == 0) { return ERR_BAD_PARAM; }
. - person Lundin   schedule 11.03.2019