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

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

например

(void) MyFunction(); 

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

 MyFunction(); 

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

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

 int n = printf( "hello" ); 

используя листинг void:

 (void) printf( "hello" ); 

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

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

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

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

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

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

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

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

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

против

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

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