Причина наличия неиспользуемых параметров в прототипе обычно заключается в том, что функция должна соответствовать некоторому внешнему 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)
пригодится приведение - оно однозначно и явно скажет компилятору, что оператор не должен иметь абсолютно никакого эффекта.