Необходимость префикса функции с (void)

Недавно я столкнулся с довольно необычным соглашением о кодировании, в котором вызов функции, возвращающей «void», имеет префикс (void).

e.g.

(void) MyFunction();  

Отличается ли он от вызова функции, например:

MyFunction();  

Есть ли у него какое-то преимущество или это еще одно ненужное, но какое-то соглашение о кодировании?


person puffadder    schedule 14.06.2010    source источник


Ответы (6)


Некоторые функции, такие как printf(), возвращают значение, которое почти никогда не используется в реальном коде (в случае printf количество напечатанных символов). Однако некоторые инструменты, такие как lint, предполагают, что если функция возвращает значение, оно должно быть использовано, и будут жаловаться, если вы не напишете что-то вроде:

int n = printf( "hello" );

используя приведение к пустоте:

(void) printf( "hello" );

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

person Community    schedule 14.06.2010
comment
Я понимаю. Но тогда зачем кому-то делать это для функции, уже возвращающей void? - person puffadder; 14.06.2010
comment
Конечно, но он сказал, что приведение было сделано для функций, которые возвращают пустоту. - person Artefacto; 14.06.2010
comment
@puffadder Можно предположить, что тип возвращаемого значения функции в какой-то момент изменился, а вызывающий код — нет. - person ; 14.06.2010

Нет, нет никакой разницы — то, что приводится к void, является возвращаемым значением функции.

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

person Artefacto    schedule 14.06.2010

Если функция что-то возвращает, то void может избежать (!) предупреждения (действительно, я никоим образом не смог заставить gcc предупредить меня о том, что возвращаемое значение потеряно) на некоторых компиляторах (или инструментах lint); но, что более важно, становится ясно, что возвращаемое значение "выбрасывается" преднамеренно (а не по ошибке).

person ShinTakezou    schedule 14.06.2010

академически: «функция» всегда что-то возвращает, иначе это была бы процедура. Итак, автор этого кода хочет сказать: «Я знаю, что это имя неправильное, но я не буду менять имя, поэтому я сделаю это нарушение видимым».

person Peter Miehle    schedule 14.06.2010

Есть ли у него какое-то преимущество или это еще одно ненужное, но какое-то соглашение о кодировании?

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

person Dummy00001    schedule 14.06.2010

На справочных страницах HPUX довольно часто в примере кода можно увидеть приведение к void, чтобы обойти предупреждения lint.

fprintf(mystream, "%s\n", "foo");

vs.

(void)fprintf(mystream, "%s\n", "foo");

Возможно, отсюда исходит автор кода. ИМО, это не очень хорошая идея, потому что большая часть семейства sprintf, например, вызывает malloc. malloc потерпит неудачу, если не хватит памяти. SIGINT также вызывает прерывание базового системного вызова write() и не записывает весь буфер для членов семейства printf().

person jim mcnamara    schedule 14.06.2010