Тип пустоты
Тип void в нескольких языках программирования , производных от C и Algol68 , является типом возвращаемого значения , функции которая обычно возвращает значение , но не передает значение результата вызывающей стороне. Обычно такие функции вызываются из-за их побочных эффектов , таких как выполнение какой-либо задачи или запись в их выходные параметры. Использование типа void в таком контексте сравнимо с процедурами в Паскале и синтаксическими конструкциями, определяющими подпрограммы в 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]
С | Эквивалент С++ |
---|---|
void f(void);
|
void f(); ( предпочтительно ) void f(void);
|
void f(); ( принимает постоянное, но неизвестное количество аргументов )
|
template <typename... Ts> void f(Ts... ts) {}
(не строго эквивалентно) |
Синтаксис C для объявления (невариативной) функции с пока не указанным количеством параметров, например void f()
выше, устарел в C99 . [3] В C23 (и C++) прототип функции с пустыми круглыми скобками объявляет функцию с нулевыми параметрами. [4] [5]
В Хаскеле [ править ]
В отличие от C++, в функциональном языке программирования Haskell тип void обозначает пустой тип , у которого нет обитателей [1] . Функция типа void не возвращает результатов, а программа с побочным эффектом с сигнатурой типа IO Void
не завершается или выходит из строя. нет тотальных функций В частности, в типе void .
Ссылки [ править ]
- ^ Ричи, Деннис М. (1993). « Развитие языка Си » . Association for Computing Machinery, Inc. через автора и Lucent Technologies Inc., 1996 г. Архивировано из оригинала 20 февраля 1998 г.
- ^ Страуструп, Бьярн (2009). Программирование: принципы и практика использования C++ . Бостон: Аддисон-Уэсли. п. 996. ИСБН 978-0-321-54372-1 .
- ^ Бьерн Страуструп, C и C++: практические примеры совместимости. Примиримые разногласия? Вам решать , Доктор Добб , 1 сентября 2002 г.; версия для печати
- ^ «WG14-N2432: Удалить поддержку определений функций с предложением списков идентификаторов» (PDF) . open-std.org . 25 сентября 2019 г. Архивировано (PDF) из оригинала 27 декабря 2022 г.
- ^ «WG14-N2841: Нет деклараторов функций без прототипов» . open-std.org . 10.10.2021. Архивировано из оригинала 12 ноября 2022 года.