Зачем использовать значение неиспользуемого значения функции для void?

В некотором проекте 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;
}

Выполняют ли две отливки для каких-либо целей?

Ответ 1

Здесь нужно избегать предупреждений от компилятора, потому что некоторые параметры не используются.

Ответ 2

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