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