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