Ответ 1
Этот код гарантирует, что вы не получите предупреждение компилятора о том, что foo и baz не используются.
Я просматриваю некоторый исходный код C, и я заметил следующее:
void some_func (char *foo, struct bar *baz)
{
(void)foo;
(void)baz;
}
Почему void
используется здесь? Я знаю (void)
, прежде чем выражение явно укажет, что значение выбрано; но может ли кто-нибудь объяснить мне обоснование такого использования?
Этот код гарантирует, что вы не получите предупреждение компилятора о том, что foo и baz не используются.
Скорее всего, кто-то строит этот код с компилятором, который испускает предупреждения для неиспользуемых аргументов и хочет подавить предупреждения.
Наиболее вероятной причиной появления этих переменных в функции является удаление любых предупреждений о неиспользуемых аргументах.
Однако, поскольку это, скорее всего, представит еще одно предупреждение (поскольку вы, вероятно, используете более высокий, чем обычно, уровень предупреждения), автор делает дополнительный шаг для их удаления.
В C утверждение
42;
действительно действителен, хотя и не очень полезен. Если вы скомпилируете:
int main (void) {
42;
return 0;
}
он не будет жаловаться (обычно). Однако, если вы скомпилируете это с помощью gcc -Wall -pedantic
(например), вы получите что-то вроде:
prog.c: In function `main':
prog.c:2: warning: statement with no effect
потому что компилятор, правильно, думает, что вы сошли с ума.
Помещение (void)
перед тем, что генерирует значение, например, 42;
будет явно указывать, что вам не важно это значение.
Я видел, что это использовалось для некоторых аналогов-retentive компиляторов, которые настаивают на том, что, поскольку функция типа printf
действительно возвращает значение, вы должны быть безумны, чтобы игнорировать ее, что привело к таким зверствам, как:
(void)printf ("Hello, world.\n");
(void)strcpy (dest, src);
: -)
В качестве примера, если вы скомпилируете:
void some_func (char *foo) {}
int main (void) { some_func (0); return 0; }
с gcc -Wall -W -pedantic
, вы получите:
warning: unused parameter `foo'
Если вы "используете" параметр:
void some_func (char *foo) { foo; }
вы получите
warning: statement with no effect
Однако, если вы используете параметр и явно игнорируете результат:
void some_func (char *foo) { (void)foo; }
вы не получите никаких предупреждений.