Зачем бросить неиспользуемое значение параметра функции в пустоту?
Вопрос
В некоторых C проекте я видел этот код:
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
(void)ud;
(void)osize;
/* some code not using `ud` or `osize` */
return ptr;
}
Делайте два отряда в пустоту служить какие-либо цели?
Решение
Следует избегать предупреждений от компилятора, потому что некоторые параметры не используются.
Другие советы
Причина для неиспользованный Параметры в прототипе обычно связаны с тем, что функция должна соответствовать некоторому внешнему API - возможно, это функция библиотеки или указатель на эту функцию передается другому функции, которая ожидает этой конвенции о вызове. Однако не все аргументы, используемые Конвенцией о вызове, фактически необходимы в самой функции.
Причина для упоминание Название параметра в теле состоит в том, чтобы избежать предупреждений, таких как
unused.c: In function ‘l_alloc’:
unused.c:3:22: warning: unused parameter ‘ud’ [-Wunused-parameter]
void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
^~
Это предупреждение Может быть подавлен с использованием фактического параметра в корпусе функции. Например, если у вас есть следующее утверждение:
ud;
Это предупреждение теперь подавляется. Однако сейчас GCC будет производить Другой предупреждение:
unused.c:5:5: warning: statement with no effect [-Wunused-value]
ud;
^~
Этот Предупреждение говорит, что заявление ud;
, будучи синтаксически действительным C, вообще ничего не влияет, и, возможно, ошибка, не в отличие от утверждения
abort;
что, возможно, должно быть написано как abort();
вместо этого для этого что-то сделать.
И вот где (void)
CAST приходит - он будет однозначно рассказать компилятору однозначно и явно, что утверждение должно быть абсолютно никакого эффекта вообще.