Cherchent à obtenir les éléments fondamentaux sur l’endroit où le terme vide vient et pourquoi il serait appelé Sub. L’intention de la question est d’aider quelqu'un qui n’a aucune expérience C et est tout à coup en regardant une base de code basés sur C.
Réponses
Trop de publicités?Fondamentalement, il signifie "rien" ou "aucune"
Il y a 3 façons de base que le vide est utilisé:
Argument de fonction:
int myFunc(void)
-- la fonction ne prend rien.De retour de la fonction de valeur:
void myFunc(int)
-- la fonction ne retourne rienGénérique pointeur de données:
void* data
-- 'données' est un pointeur vers les données de type inconnu, et ne peut pas être déréférencé
Remarque: le vide en fonction de l'argument est facultatif en C++; int myFunc()
est exactement le même que int myFunc(void)
. Il est nécessaire pour une valeur de retour.
J'ai toujours pris ça pour dire absent. Voici quatre cas dans le langage C qui correspond à cette utilisation de l' absent
-
R f(void)
- Paramètres de la fonction sont absents -
void f(P)
- Valeur de retour est absent -
void *p
- Type de ce qui est souligné est absent -
(void) p
- Utilisation de la valeur est absente
D'autres C descendants utiliser pour d'autres choses. L' D
langage de programmation utilise pour les cas où un initialiseur est absent
-
T t = void;
- initialisation de la valeur est absente
Il y a deux façons d'utiliser les nuls:
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 deuxième indique au compilateur qu'il n'est pas associé avec les données effectivement ce qui signifie que vous ne pouvez pas faire usage des données fait ressortir jusqu'à ce qu'il en est jeté d'un type connu.
Par exemple, vous verrez void*
beaucoup utilisé lorsque vous disposez d'une interface qui appelle une fonction dont les paramètres ne peuvent pas être connu à l'avance.
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;
Puis un thread du noyau va sur une liste de travail différé et quand elle est à ce nœud, il exécute efficacement:
bar(somedata);
Puis dans la barre vous devez:
void bar(void* mydata) {
int *data = mydata;
/* do something with data */;
}
Il indique l’absence d’une valeur de retour d’une fonction.
Certaines langues ont deux sortes de sous-routines : procédures et fonctions. Les procédures sont juste une séquence d’opérations, alors qu’une fonction est une séquence d’opérations qui retournent un résultat.
C et ses dérivés, la différence entre les deux n’est pas explicite. Tout est essentiellement une fonction. le `` mot clé indique qu’il n’est pas une fonction « réelle », puisqu’elle ne renvoie pas une valeur.