В языке C введен тип void
со значением «не волнует» больше, чем «ноль» или «ничего», и он используется для различных областей.
void
ключевое слово может ссылаться на void type
, reference to void
, void expression
, void operand
или void function
.Он также явно определяет функцию, не имеющую параметров.
Давайте рассмотрим некоторые из них.
Тип void
Прежде всего void
объект существует и обладает некоторыми специальными свойствами, как указано в ISO / IEC 9899: 2017, §6.2.5 Типы :
Тип void содержит пустой набор значений;это неполный тип объекта, который не может быть завершен.
Указатели
Чем полезнее reference to void
, либо void *
, это ссылка нанеполный тип, но сам по себе хорошо определен, а затем является полным типом, имеет размер и может использоваться как любая другая стандартная переменная, как указано в ISO / IEC 9899: 2017, §6.2.5 Типы :
Указатель на void должен иметь те же требования к представлению и выравниванию, что и указатель на тип символа.
Аналогично, указатели на квалифицированные или неквалифицированные версии совместимых типов должны иметь одинаковое представление и выравнивание.требования.
Все указатели на типы конструкций должны иметь те же требования к представлению и выравниванию, что и другие.
Все указатели на типы объединения должны иметь те же требования к представлению и выравниванию, что и другие.
Указатели на другие типы не обязательно должны иметь одинаковые требования к представлению или выравниванию.
Приведение к void
Может бытьиспользуется как cast для аннулирования выражения, но позволяет завершить любой побочный эффект такого выражения.Эта концепция объясняется в стандарте в ИСО / МЭК 9899: 2017, §6.3 Преобразования, §6.3.2.2 void :
(не существует)Значение выражения void (выражение с типом void) не должно использоваться никоим образом, и неявные или явные преобразования (за исключением void) не должны применяться к такому выражению.
Если выражениелюбой другой тип оценивается как пустое выражение, его значение или обозначение отбрасывается.( Пустое выражение оценивается на предмет его побочных эффектов. )
Практическим примером приведения к void
является его использование для предотвращения предупреждения онеиспользуемые параметры в определении функции:
int fn(int a, int b)
{
(void)b; //This will flag the parameter b as used
... //Your code is here
return 0;
}
Приведенный выше фрагмент демонстрирует стандартную практику, используемую для отключения предупреждений компилятора.Приведение к void
параметра b
действует как эффективное выражение, которое не генерирует код и помечает b
как используемое, предотвращая появление жалоб компилятора.
void
Функции
Абзац §6.3.2.2 void стандарта также охватывает некоторые пояснения о void
функциях, которые являются такими функциями, которые не возвращают никакого значения, пригодного для использования в выражении, но функции вызываются в любом случаедля реализации побочных эффектов.
void
свойства указателей
Как мы уже говорили, указатели на void
гораздо более полезны, поскольку они позволяют обрабатывать ссылки на объекты в общем видеиз-за их свойства, объясненного в ISO / IEC 9899: 2017, §6.3.2.3 указателей :
Указатель на void может быть преобразован в или изуказатель на любой тип объекта.
Указатель на любой тип объекта может быть преобразован в указатель на void и обратно;результат должен сравниться с исходным указателем .
В качестве практического примера представьте функцию, возвращающую указатель на разные объекты в зависимости от входных параметров:
enum
{
FAMILY, //Software family as integer
VERSION, //Software version as float
NAME //Software release name as char string
} eRelease;
void *GetSoftwareInfo(eRelease par)
{
static const int iFamily = 1;
static const float fVersion = 2.0;
static const *char szName = "Rel2 Toaster";
switch(par)
{
case FAMILY:
return &iFamily;
case VERSION:
return &fVersion;
case NAME:
return szName;
}
return NULL;
}
В этом фрагменте вы можете вернуть общий указатель, который может зависеть от входного значения par
.
void
в качестве параметра функции
Использование параметра void
в определениях функций было введено после, так называемого, стандарта ANSI, для эффективного устранения неоднозначности функций с переменным числом аргументов у функций, имеющих нет.аргументы .
Из стандарта ИСО / МЭК 9899: 2017, 6.7.6.3 Деклараторы функций (включая прототипы) :
Особый случай безымянного параметра типа void
в качестве единственного элемента в списке указывает, что у функции нет параметров.
Фактические компиляторы все еще поддерживают объявление функции с пустымскобки для обратной совместимости, но это устаревшая функция, которая в конечном итоге будет удалена в следующем выпуске стандарта.См. Дальнейшие указания - §6.11.6 Деклараторы функций :
- Использование деклараторов функций с пустыми скобками (не деклараторы типа параметров формата прототипа) является устаревшей функцией.
Рассмотрим следующий пример:
int foo(); //prototype of variable arguments function (backward compatibility)
int bar(void); //prototype of no arguments function
int a = foo(2); //Allowed
int b = foo(); //Allowed
int c = bar(); //Allowed
int d = bar(1); //Error!
Теперь напоминаем ваш тест, если мы вызываем функцию bar
следующим образом:
int a = 1;
bar((void)a);
Вызывает ошибку, потому что приведение к void
объекта не обнуляет его.Таким образом, вы все еще пытаетесь передать объект void
в качестве параметра функции, у которой его нет.
Побочные эффекты
По запросу это краткое объяснение побочные эффекты concept.
Побочным эффектом является любое изменение объектов и значений, полученных в результате выполнения оператора и не являющееся прямым ожидаемым эффектом.
int a = 0;
(void)b = ++a;
В приведенном выше фрагменте выражения void теряется прямой эффект, присваивающий b
, но в качестве побочный эффект увеличивается значение a
.
Единственная ссылка, поясняющая значение,в стандарте можно найти в 5.1.2.3 Выполнение программы :
Доступ к энергозависимому объекту, изменение объекта, изменение файла или вызов функции, выполняющей любую из этих операций, являются побочными эффектами, которые являются изменениями в состоянии среды выполнения.
Оценка выражения в целом включает как вычисления значений, так и инициирование побочных эффектов .