web-dev-qa-db-fra.com

Void est-il un type de données en C?

void est-il un type de données dans le langage de programmation C? Si oui, quel type de valeurs peut-il stocker? Si nous avons int, float, char, etc., pour stocker les valeurs, pourquoi void est-il nécessaire? Et quelle est la plage de vide?

47
suhel

Void est considéré comme un type de données (à des fins d'organisation), mais il s'agit essentiellement d'un mot-clé à utiliser comme espace réservé où vous mettriez un type de données, pour représenter "aucune donnée".

Par conséquent, vous pouvez déclarer une routine qui ne renvoie pas de valeur comme:

void MyRoutine();

Mais, vous ne pouvez pas déclarer une variable comme celle-ci:

void bad_variable;

Cependant, lorsqu'il est utilisé comme pointeur, il a une signification différente:

void* vague_pointer;

Cela déclare un pointeur, mais sans spécifier le type de données vers lequel il pointe.

75
James Curran

Oui, void est un type. Que ce soit un type de données dépend de la façon dont vous définissez ce terme; la norme C ne le fait pas.

La norme définit le terme "type d'objet". En C99 et versions antérieures; void n'est pas un type d'objet; en C11, c'est le cas. Dans toutes les versions de la norme, void est un type incomplet . Ce qui a changé en C11, c'est que les types incomplets sont maintenant un sous-ensemble de types d'objets; ce n'est qu'un changement de terminologie. (L'autre type de type est un type de fonction .)

C99 6.2.6 paragraphe 19 dit:

Le type void comprend un ensemble vide de valeurs; c'est un type incomplet qui ne peut pas être complété.

La norme C11 modifie légèrement la formulation:

Le type void comprend un ensemble vide de valeurs; il s'agit d'un type d'objet incomplet qui ne peut pas être complété.

Cela reflète le changement de C11 dans la définition de "type d'objet" pour inclure les types incomplets; cela ne change rien à la nature du type void.

Le mot clé void peut également être utilisé dans certains autres contextes:

  • En tant que seul type de paramètre dans un prototype de fonction, comme dans int func(void), il indique que la fonction n'a pas de paramètres. (C++ utilise des parenthèses vides pour cela, mais ils signifient autre chose en C.)

  • En tant que type de retour d'une fonction, comme dans void func(int n), il indique que la fonction ne renvoie aucun résultat.

  • void* est un type de pointeur qui ne spécifie pas vers quoi il pointe.

En principe, toutes ces utilisations se réfèrent au type void, mais vous pouvez également les considérer comme une syntaxe spéciale qui arrive à utilisez le même mot-clé.

23
Keith Thompson

La norme C indique que void est un type incomplet qui ne peut pas être complété (contrairement à d'autres types incomplets qui peuvent être complétés). Cela signifie que vous ne pouvez pas appliquer l'opérateur sizeof à void, mais vous pouvez avoir un pointeur sur un type incomplet.

5
Jens