Que signifie void en C, C++ et C#?

Cherche à obtenir les fondamentaux sur l'origine du terme "void", et pourquoi il est appelé void. L'intention de la question Est d'aider quelqu'un qui n'a pas D'expérience C, et regarde soudainement une base de code basée sur C.

149
demandé sur edmond 2009-06-25 14:04:32

15 réponses

Fondamentalement, cela signifie "rien" ou "Aucun type"

Il y a 3 façons de base que void est utilisé:

  1. Argument de Fonction: int myFunc(void) -- la fonction ne prend rien.

  2. Fonction valeur de retour: void myFunc(int) -- la fonction ne renvoie rien

  3. Pointeur de données Générique: void* data -- 'data' est un pointeur vers des données de type inconnu, et ne peut pas être déréférencé

Note: le void dans un argument de fonction est facultatif en C++, donc int myFunc() est exactement le identique à int myFunc(void), et il est complètement laissé en C#. Il est toujours nécessaire pour une valeur de retour.

203
répondu Gerald 2014-10-15 15:11:10

Je l'ai toujours pris pour signifier absent . Voici quatre cas dans le langage C qui correspond à cette utilisation de absent

  • R f(void) - les paramètres de fonction sont absents
  • void f(P) - la valeur de retour est absente
  • void *p - le Type de ce qui est pointé est absent
  • (void) p - L'utilisation de la valeur est absente

Les autres descendants C l'utilisent pour d'autres choses. Le langage de programmation D l'utilise pour les cas où un initialiseur est absent

  • T t = void; - la valeur d'initialisation est absente
23
répondu Johannes Schaub - litb 2009-06-25 14:23:12

Cela signifie "Aucune valeur". Vous utilisez void pour indiquer qu'une fonction ne renvoie pas de valeur ou qu'elle n'a pas de paramètres ou les deux. À peu près compatible avec les utilisations typiques de word void en anglais.

13
répondu sharptooth 2009-06-25 10:06:51

Il y a deux façons d'utiliser void:

void foo(void);

Ou

void *bar(void*);

La première indique qu'aucun argument n'est transmis ou qu'aucun argument n'est retourné.

La seconde indique au compilateur qu'il n'y a pas de type associé aux données, ce qui signifie que vous ne pouvez pas utiliser les données pointées jusqu'à ce qu'elles soient converties en un type connu.

Par exemple, vous verrez que void* est beaucoup utilisé lorsque vous avez une interface qui appelle une fonction dont les paramètres ne peuvent pas être connus l'avance de temps.

Par exemple, dans le Noyau Linux lors de report de travail vous permet de configurer une fonction à exécuter à un moment, en lui donnant un pointeur vers la fonction à exécuter et un pointeur vers les données à transmettre à la fonction:

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

Ensuite, un thread du noyau passe sur une liste de travail différé et quand il arrive à ce nœud, il s'exécute efficacement:

bar(somedata);

Ensuite, dans la barre, Vous Avez:

void bar(void* mydata) {
    int *data = mydata;
    /* do something with data */;
}
11
répondu Robert S. Barnes 2013-10-01 17:29:10

Indique l'absence de valeur de retour dans une fonction.

Certains langages ont deux sortes de sous-programmes: les procédures et les fonctions. Les procédures sont juste une séquence d'opérations, tandis qu'une fonction est une séquence d'opérations qui retournent un résultat.

Dans C et ses dérivés, la différence entre les deux n'est pas explicite. Tout est fondamentalement une fonction. le mot-clé void indique que ce n'est pas une fonction" réelle", car elle ne renvoie pas de valeur.

4
répondu Rik 2009-06-25 10:15:38

Pensez à void comme la "structure vide". Laissez-moi vous expliquer.

Chaque fonction prend une séquence de paramètres, où chaque paramètre a un type. En fait, nous pourrions regrouper les paramètres dans une structure, avec les fentes de structure correspondant aux paramètres. Cela fait que chaque fonction a exactement un argument. De même, les fonctions produisent un résultat, qui a un type. Il pourrait être un booléen, ou il pourrait être flotteur, ou il pourrait être une structure contenant un ensemble arbitraire de autres valeurs typées. Si nous voulons un languge qui a plusieurs valeurs de retour, il est facile d'insister simplement sur le fait qu'ils soient empaquetés dans une structure. En fait, nous pourrions toujours insister pour qu'une fonction renvoie une structure. Maintenant, chaque fonction prend exactement un argument, et produit exactement une valeur.

Maintenant, que se passe-t-il lorsque j'ai besoin d'une fonction qui produit une valeur "no"? Eh bien, considérez ce que je reçois quand je forme une structure avec 3 slots: it contient 3 valeurs. Quand j'ai 2 slots, il contient deux valeurs. Lorsque il a une fente, une valeur. Et quand il a zéro slots, il tient... euh, les valeurs zéro, ou "aucune" valeur". Donc, je peux penser à une fonction retournant void comme renvoyant une structure ne contenant aucune valeur. Vous pouvez même décider de ce "vide" est juste un synonyme pour le type représenté par la structure vide, plutôt qu'un mot-clé dans la langue (peut-être que c'est juste un type prédéfini:)

De même, je peux penser qu'une fonction ne nécessitant aucune valeur accepte une structure vide, par exemple, "void".

Je peux même implémenter mon langage de programmation de cette façon. Passage d'une valeur vide prend zéro octet, donc passer des valeurs void est juste un cas particulier de passage autres valeurs de taille arbitraire. Cela rend le compilateur facile à traiter le résultat ou l'argument" nul". Vous voulez probablement une fonctionnalité de langauge cela peut jeter un résultat de fonction; en C, si vous appelez le résultat non vide fonction foo dans l'instruction suivante: foo(...); le compilateur sait que foo produit un résultat et ignore simplement il. Si le vide est une valeur, cela fonctionne parfaitement et maintenant "procédures" (qui sont juste un adjectif pour une fonction avec un résultat nul) sont juste triviaux Spéciaux cas de fonctions générales.

Void* est un peu plus drôle. Je ne pense pas que les concepteurs C aient pensé à void dans le ci-dessus; ils viennent de créer un mot-clé. Ce mot clé était disponible quand quelqu'un besoin d'un point à un type arbitraire, donc void* comme idiome en C. Cela fonctionne assez bien si vous interprétez void comme une structure vide. Un void * pointeur est l'adresse d'un endroit où cette structure vide a été mis.

Convertit De void* à T * pour les autres types T, travaillez également avec cette perspective. Les lancers de pointeurs sont une triche complète qui fonctionne sur les architectures les plus courantes pour tirer parti du fait que si un type composé T a un élément avec un sous-Type S placé physiquement au début de T dans sa disposition de stockage, puis lancer S * À T * et vice versa en utilisant la même adresse de machine physique tend à la plupart des pointeurs de machine ont une représentation unique. Remplacer le type s par le type void donne exactement le même effet, et donc lancer vers/depuis void* fonctionne.

Le langage de programmation PARLANSE implémente assez étroitement les idées ci-dessus. Nous avons gaffé dans sa conception, et n'a pas prêté une attention particulière à "void" comme un retour tapez et ont donc des mots-clés langauge pour la procédure. C'est surtout juste un simple changement de syntaxe mais c'est l'une des choses que vous ne pouvez pas faire une fois que vous obtenez un grand corps code de travail dans une langue.

3
répondu Ira Baxter 2009-06-29 21:53:43

En c#, vous utiliseriez le mot-clé void pour indiquer qu'une méthode ne renvoie pas de valeur:

public void DoSomeWork()
{
//some work
}
2
répondu Charlie 2009-06-25 10:09:32

Trois cas d'utilisation pour les nuls:

  1. Signatures de fonction. void foo(int bar) ne renvoie pas de valeur. int bar(void) ne prend aucun paramètre mais ceci est généralement exprimé avec une liste d'arguments vide: int bar(). L'utilisation du mot-clé void ici correspond à sa signification en anglais.

  2. Pointeur générique de type supérieur {[3] } qui pointe vers des données non spécifiées et ne peut pas être déréférencé. Ici, la signification de void est différente des autres significations De void: universal type vs. no type.

  3. Dans des casts tels que (void) new Foo(this) pour signifier que la valeur de retour est délibérément jetée. Ici, l'utilisation du mot clé correspond également à sa signification en anglais.

Les Cas 1 et 2 étaient déjà couverts par @ Gerald mais le cas 3 n'a pas encore été traité.

2
répondu laalto 2009-06-25 11:20:36

Si vous expliquez le concept à un débutant, il peut être utile d'utiliser une analogie. L'utilisation du vide dans tous ces cas est analogue dans le sens d'une page dans un livre qui a les mots suivants: "Cette page est laissée intentionnellement vide."C'est de différencier au compilateur quelque chose qui devrait être signalé comme une erreur, par rapport à un type qui doit intentionnellement être laissé vide parce que c'est le comportement que vous voulez.

Il apparaît toujours dans le code où normalement vous vous attendez pour voir apparaître un type, tel qu'un type de retour ou un type de pointeur. C'est pourquoi en C#, void correspond à un système de type CLR réel.Void parce que c'est un type en soi.

Certains langages de programmation n'ont jamais développé le concept de vide, tout comme certaines cultures humaines n'ont jamais inventé le concept du nombre zéro. Void représente le même avancement dans un langage de programmation que le concept de zéro représente pour le langage humain.

2
répondu TimF 2009-06-25 12:11:27

Cela signifie "Aucune valeur". Vous utilisez void pour indiquer qu'une fonction ne renvoie pas de valeur ou qu'elle n'a pas de paramètres ou both.It est très compatible avec les utilisations typiques de Word void en anglais.

Void ne doit pas être confondu avec null. Null signifie pour la variable dont l'adresse est sur la pile, la valeur sur le tas pour cette adresse est vide.

1
répondu AVI 2015-12-28 03:28:43

Void est utilisé uniquement dans les signatures de méthode. Pour les types de retour, cela signifie que la méthode ne retournera rien au code appelant. Pour les paramètres, cela signifie qu'aucun paramètre n'est passé à la méthode

Par exemple

void MethodThatReturnsAndTakesVoid(void)
{
// Method body
}

En C # nous pouvons omettre le vide pour les paramètres et peut écrire le code ci-dessus comme:

void MethodThatReturnsAndTakesVoid()
{
// Method body
}

Void ne doit pas être confondu avec null. Null signifie pour la variable dont l'adresse est sur la pile, la valeur sur le tas pour cette adresse est vide.

0
répondu Rashmi Pandit 2009-06-25 10:12:06

Void est un type incomplet qui, par définition, ne peut pas être une lvalue. Ce qui signifie qu'il ne peut pas obtenir une valeur assignée.

Donc, il ne peut pas non plus contenir de valeur.

0
répondu dhein 2014-10-15 14:49:21

Void signifie que vous ne retournerez aucune valeur de la fonction ou de la méthode

-1
répondu Hannoun Yassir 2009-06-25 10:21:07

Void signifie Aucune valeur requise dans le type de retour d'une fonction dans les trois langues.

-1
répondu Nakul Chaudhary 2009-06-25 10:32:28

Void est l'équivalent du Sub de Visual Basic.

-1
répondu cyclo 2009-06-25 11:43:37