Вопрос по c++, c#, c – Что значит void в C, C ++ и C #?

159

Нужны основные принципы определения термина & quot;void& Quot; происходит, и почему это называется пустота. Цель этого вопроса - помочь кому-то, у кого нет опыта работы с C, и он вдруг смотрит на кодовую базу на основе C.

Я считаю это отличным вопросом. Dave Van den Eynde
Этот вопрос состоит из 3 языков ... этот старый вопрос должен быть разделен на 3 разных вопроса. Stargateur

Ваш Ответ

15   ответов
2

Function signatures. void foo(int bar) does not return a value. int bar(void) does not take any parameters but this is usually expressed with empty argument list: int bar(). Usage of the void keyword here corresponds to its meaning in English.

Generic top-type pointer void * that points to unspecified data and cannot be dereferenced. Here the meaning of void is different from other meanings of void: universal type vs. no type.

In casts such as (void) new Foo(this) to signify that the return value is deliberately thrown away. Here the keyword usage also matches its meaning in English.

Случаи 1 и 2 уже были рассмотрены @Gerald, но случай 3 еще не был рассмотрен.

3

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

Теперь, что происходит, когда мне нужна функция, которая выдает «нет»? значение? Хорошо, рассмотрим, что я получу, когда сформирую структуру с 3 слотами: содержит 3 значения. Когда у меня есть 2 слота, он содержит два значения. Когда это имеет один слот, одно значение. И когда у него ноль слотов, он держит ... э-э, нулевые значения или «нет» Значение & Quot ;. Итак, я могу думать о функции, возвращающей пустоту как возвращение структуры, не содержащей значений. Вы даже можете решить, что & quot; void & quot; это просто синоним для типа, представленного пустой структурой, а не ключевое слово в языке (может быть, это просто предопределенный тип :)

Точно так же я могу думать о функции, не требующей значений, как о принятии пустой структуры, например, «void».

Я даже могу реализовать свой язык программирования таким образом. Передача пустого значения занимает нулевые байты, поэтому передача пустых значений является лишь частным случаем передачи другие значения произвольного размера. Это облегчает обработку компилятором «пустота» результат или аргумент. Вы, вероятно, хотите функцию языка это может отбросить результат функции; в C, если вы называете не пустым результатом функция foo в следующем утверждении:       Foo (...); компилятор знает, что foo выдает результат, и просто игнорирует его. Если void является значением, это работает отлично, и теперь «процедуры» (которые просто прилагательное для функции с пустым результатом) просто тривиально случаи общих функций.

Void * немного смешнее. Я не думаю, что дизайнеры C думали о пустоте в вышеуказанным способом; они просто создали ключевое слово. Это ключевое слово было доступно, когда кто-то нужна точка на произвольный тип, поэтому void * как идиома в C. Это на самом деле работает довольно хорошо, если вы интерпретируете пустоту как пустую структуру. Указатель void * - это адрес места, где эта пустая структура имеет был поставлен

Приведения типов void * к T * для других типов T также работают с этой точки зрения. Приведения указателей представляют собой полный чит, который работает на большинстве распространенных архитектур, чтобы использовать тот факт, что если составной тип T имеет элемент с подтипом S, физически помещенный в начале T в его макете хранилища, то приведение S * к T * и наоборот, использование одного и того же физического адреса машины имеет тенденцию работать, так как большинство указателей машины имеют одно представление. Замена типа S на тип void дает точно такой же эффект, и, таким образом, приведение к / от void * работает.

Язык программирования PARLANSE реализует вышеприведенные идеи довольно близко. Мы пошутили о его дизайне и не обратили пристального внимания на «void». в качестве возврата введите и, следовательно, есть ключевые слова языка для процедуры. В основном это просто изменение синтаксиса, но это одна из вещей, которую вы не можете найти, когда получите большой рабочий код на языке.

13

Существует два способа использования void:

void foo(void);

или же

void *bar(void*);

Первый указывает, что аргумент не передается или аргумент не возвращается.

Второй сообщает компилятору, что с данными не связан тип, что означает, что вы не можете использовать указанные данные, пока они не будут преобразованы в известный тип.

Например, вы увидитеvoid* часто используется, когда у вас есть интерфейс, который вызывает функцию, параметры которой не могут быть известны заранее.

Например, в ядре Linux при отложении работы вы настраиваете функцию, которая будет запускаться позднее, давая ей указатель на функцию, которую нужно запустить, и указатель на данные, которые будут переданы функции:

struct _deferred_work {
sruct list_head mylist;
.worker_func = bar;
.data        = somedata;
} deferred_work;

Затем поток ядра просматривает список отложенной работы и, когда он достигает этого узла, он эффективно выполняет:

bar(somedata);

Тогда в баре у вас есть:

void bar(void* mydata) {
    int *data = mydata;
    /* do something with data */;
}
2

может быть полезно использовать аналогию. Использование void во всех этих случаях аналогично по значению странице в книге, в которой есть следующие слова: «Эта страница оставлена намеренно пустой». Он должен различать для компилятора что-то, что должно быть помечено как ошибка, и тип, который намеренно следует оставить пустым, потому что это поведение, которое вы хотите.

Он всегда появляется в коде, где обычно вы ожидаете увидеть тип, такой как тип возврата или тип указателя. Вот почему в C # void отображается на фактический тип CLR, System.Void, потому что он сам по себе является типом.

Некоторые языки программирования никогда не развивали концепцию пустоты, как некоторые человеческие культуры никогда не изобретали концепцию числа ноль. Пустота представляет собой тот же прогресс в языке программирования, что и концепция нуля для человеческого языка.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

в это означает, что метод не будет ничего возвращать вызывающему коду. Для параметров это означает, что в метод не передаются параметры

например

void MethodThatReturnsAndTakesVoid(void)
{
// Method body
}

В C # мы можем опустить void для параметров и написать следующий код как:

void MethodThatReturnsAndTakesVoid()
{
// Method body
}

Void should not be confused with null. Null означает для переменной, адрес которой находится в стеке, значение в куче для этого адреса пусто.

4

Некоторые языки имеют два вида подпрограмм: процедуры и функции. Процедуры - это просто последовательность операций, тогда как функция - это последовательность операций, которые возвращают результат.

В C и его производных разница между ними не является явной. Все в основном функция.void Ключевое слово указывает, что оно не является "фактическим". функция, так как она не возвращает значение.

27

absent, Вот четыре случая на языке C, которые соответствуют этому использованиюabsent

R f(void) - Function parameters are absent void f(P) - Return value is absent void *p - Type of what is pointed to is absent (void) p - Usage of value is absent

Другие потомки Си используют его для других вещей.D язык программирования использует его для случаев, когда инициализаторabsent

T t = void; - initializing value is absent
Error: User Rate Limit Exceeded(void)pError: User Rate Limit Exceeded
13

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

1

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

Void should not be confused with null. Null означает для переменной, адрес которой находится в стеке, значение в куче для этого адреса пусто.

-1

Error: User Rate Limit Exceeded
211

Существует 3 основных способа использования void:

Function argument: int myFunc(void) -- the function takes nothing.

Function return value: void myFunc(int) -- the function returns nothing

Generic data pointer: void* data -- 'data' is a pointer to data of unknown type, and cannot be dereferenced

Обратите вниманиеvoid в аргументе функции является необязательным в C ++, поэтомуint myFunc() точно так же, какint myFunc(void)и это полностью исключено в C #. Это всегда требуется для возвращаемого значения.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/416345/…
Error: User Rate Limit Exceeded
-1

что вы не будете возвращать любое значение из функции или метода

2

чтобы указать, что метод не возвращает значение:

public void DoSomeWork()
{
//some work
}
Error: User Rate Limit Exceededmsdn.microsoft.com/en-us/library/system.void.aspx
0

который по определению не может быть lvalue. Это означает, что ему не может быть присвоено значение.

Таким образом, он также не может содержать любое значение.

-1

что значение не требуется в типе возврата от функции на всех трех языках.

Похожие вопросы