Тип void в нескольких языках программирования, производных от C и Algol68 , является типом результата функции, которая обычно возвращается, но не предоставляет значение результата вызывающей стороне. Обычно такие функции вызываются из-за их побочных эффектов , таких как выполнение некоторой задачи или запись в их выходные параметры. Использование типа void в таком контексте сравнимо с процедурами в Pascal и синтаксическими конструкциями, которые определяют подпрограммы в Visual Basic . Он также похож на тип модуля, используемый в языках функционального программирования.и теория типов. Для сравнения см. Тип модуля # в языках программирования .
C и C ++ также поддерживают указатель на тип void (указанный как void *
), но это не связанное с этим понятие. Переменные этого типа являются указателями на данные неопределенного типа, поэтому в этом контексте (но не в других) void *
действуют примерно как универсальный или верхний тип . Программа, вероятно, может преобразовать указатель на любой тип данных (кроме указателя на функцию ) в указатель на void и обратно в исходный тип без потери информации, что делает эти указатели полезными для полиморфных функций. Стандарт языка C не гарантирует, что разные типы указателей имеют одинаковый размер или выравнивание.
В C и C ++ [ править ]
Функция с типом результата void завершается либо достижением конца функции, либо выполнением оператора return без возвращаемого значения. Пустота типа может также появиться в качестве единственного аргумента о прототипе функции , чтобы указать , что функция не принимает никаких аргументов. Обратите внимание, что, несмотря на название, во всех этих ситуациях тип void служит типом единицы , а не нулевым или нижним типом (который иногда ошибочно называют "типом void"), хотя в отличие от реального типа единицы, который является одноэлементный тип void не имеет способа представления его значения, а язык не предоставляет никакого способа объявить объект или представить значение с типом void
.
В самых ранних версиях C функции без определенного результата по умолчанию возвращались к типу возвращаемого значения, int
а функции без аргументов просто имели пустые списки аргументов. Указатели на нетипизированные данные были объявлены как целые числа или указатели на char
. Некоторые ранние компиляторы C имели возможность, которая теперь воспринимается как раздражение, генерировать предупреждение при любом вызове функции, который не использовал возвращаемое значение функции. Старый код иногда приводит такие вызовы функций к void, чтобы подавить это предупреждение. К тому времени, когда Бьярн Страуструп начал свою работу над C ++ в 1979–1980 годах, указатели void и void были частью диалекта языка C, поддерживаемого компиляторами, производными от AT&T. [1]
Явное использование void и отсутствие аргументов в прототипе функции имеет разную семантику в C и C ++, как подробно описано в следующей таблице: [2]
C | Эквивалент C ++ |
---|---|
void f(void); | void f(); ( предпочтительно )void f(void); |
void f(); ( принимает постоянное, но неизвестное количество аргументов ) | template <typename... Ts> void f(Ts... ts) {} (не строго эквивалентно) |
AC прототип не принимает никаких аргументов, например , void f()
выше, является устаревшим в C99 , [3] , однако.
В Haskell [ править ]
В отличие от C ++, в языке функционального программирования Haskell тип void обозначает пустой тип, не имеющий обитателей [1] . Функция с типом void не возвращает результатов, а программа с побочными эффектами с сигнатурой типа IO Void
не завершается или не завершается. В частности, в тип void нет общих функций .
Ссылки [ править ]
- ^ http://cm.bell-labs.com/cm/cs/who/dmr/chist.html , «Стандартизация».
- ^ Страуструп, Бьярне (2009). Программирование: принципы и практика использования C ++ . Бостон: Эддисон-Уэсли. п. 996. ISBN. 0-321-54372-6.
- ^ Бьярн Страуструп, C и C ++: примеры совместимости. Примиримые разногласия? Вы решаете , доктор Добб , 1 сентября 2002 года; версия для печати