Тип пустоты
Тип 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 года.