2010-06-14 4 views
5

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

например.

(void) MyFunction(); 

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

MyFunction(); 

Имеет он получил какое-то преимущество или это еще один Излишне но кодирования условность какой-то?

ответ

12

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

int n = printf("hello"); 

используя порового бросок:

(void) printf("hello"); 

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

+0

Я вижу. Но тогда почему кто-то хочет сделать это для функции, уже возвращающей пустоту? – puffadder

+0

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

+4

@puffadder В предположении, что тип возвращаемой функции в какой-то момент изменился, но код вызова не изменился. –

2

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

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

0

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

0

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

0

Имеет он получил какое-то преимущество или это еще один сам собой, но существует какое-то условное кодирование?

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

0

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

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

против

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

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