Зачем приводить значение неиспользуемого параметра функции в void? - PullRequest
91 голосов
/ 10 января 2011

В каком-то 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;
}

Служат ли два приведения к аннулированию для какой-либо цели?

Ответы [ 2 ]

82 голосов
/ 10 января 2011

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

10 голосов
/ 24 августа 2017

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

* Входит литье - оно однозначно и недвусмысленно сообщит компилятору, что это утверждение не должно иметь абсолютно никакого эффекта.

...