Странное использование пустоты

Я просматриваю некоторый исходный код C, и я заметил следующее:

void some_func (char *foo, struct bar *baz)
{
    (void)foo;
    (void)baz;
}

Почему void используется здесь? Я знаю (void), прежде чем выражение явно укажет, что значение выбрано; но может ли кто-нибудь объяснить мне обоснование такого использования?

Ответ 1

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

Ответ 2

Скорее всего, кто-то строит этот код с компилятором, который испускает предупреждения для неиспользуемых аргументов и хочет подавить предупреждения.

Ответ 3

Наиболее вероятной причиной появления этих переменных в функции является удаление любых предупреждений о неиспользуемых аргументах.

Однако, поскольку это, скорее всего, представит еще одно предупреждение (поскольку вы, вероятно, используете более высокий, чем обычно, уровень предупреждения), автор делает дополнительный шаг для их удаления.

В 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; }

вы не получите никаких предупреждений.