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