Необходим префикс функции с (void) - PullRequest
5 голосов
/ 14 июня 2010

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

например,

(void) MyFunction();  

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

MyFunction();  

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

Ответы [ 6 ]

12 голосов
/ 14 июня 2010

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

int n = printf( "hello" );

с использованием пустоты:

(void) printf( "hello" );

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

2 голосов
/ 14 июня 2010

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

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

0 голосов
/ 14 июня 2010

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

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

против

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

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

0 голосов
/ 14 июня 2010

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

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

0 голосов
/ 14 июня 2010

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

0 голосов
/ 14 июня 2010

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

...