Duplicate possible:
Pourquoi le type de la fonction principale en C et c ++ est-il laissé à l'utilisateur?
Qu'est-ce qu'un void ? Quelqu'un fournit-il des exemples d'utilisation correcte de void ? Et quelle est la différence lorsque nous écrivons void main (void)
ou main()
?
En C, en général, (void)
signifie qu'aucun argument n'est requis dans l'appel de fonction, alors que ()
signifie un nombre non spécifié d'arguments.
par exemple.
void foo(void)
{
// body
}
void bar()
{
//body
}
En appelant l'environnement,
foo(); // Correct
foo(1); // Incorrect
bar(); // Correct
bar(1); // Also correct
C'était l'explication générale.
Mais pour votre cas pour main (), C99 Standard dit que,
5.1.2.2.1 Démarrage du programme
La fonction appelée au démarrage du programme s'appelle main. L'implémentation ne déclare aucun prototype pour cette fonction. Il doit être défini avec un type de retour int et sans paramètre:
int main(void) { /* ... */ }
ou
avec deux paramètres (appelés ici argc et argv, bien que tous les noms puissent être utilisés, car ils sont locaux à la fonction dans laquelle ils sont déclarés):
int main(int argc, char *argv[]) { /* ... */ }
ou équivalent;
ou
d'une autre manière définie par l'implémentation.
Ainsi, dans ce type de retour void main(void)
devrait être int
.
Et enfin, pour main()
, le type de retour n'est pas donné, alors implicitement le type de retour serait int
.
Fondamentalement, void est un type de données, utilisé essentiellement avec la déclaration de méthode. Cela signifie rien ou pas de type . Par exemple:
1) int myFunc(void)
- la fonction ne prend rien.
2) void myFunc(int)
- la fonction ne renvoie rien
3) void* data;
- 'data' est un pointeur sur des données de type inconnu et ne peut pas être déréférencé.
Exclure le type de retour de la main comme dans
main(){
}
ne signifie pas que c'est un type void
, cela dépend du compilateur. Je pense qu'on peut dire que c'est interprété génériquement
int main(){
}
Le type void
indique au compilateur qu'il n'y a pas d '"entité" (pas de "stockage"), donc
void func(int i)
prend un int mais ne retourne rien. Dans le cas de paramètres ceci:
void func()
est équivalent à ceci:
void func(void)
ce qui indique plus explicitement qu'il ne prend pas de paramètres. Une histoire différente est avec le type void *
qui est un type, un pointeur sur quelque chose de sans dimension.
Vide signifie "Vide". Dans votre exemple de void main (), cela signifie que les fonctions main () ne renvoient pas de valeur. Je me sens obligé de vous dire que void main () devrait être évité (sans jeu de mots) à tout prix, utilisez int main () à la place. int main () s'assure que votre programme peut renvoyer une valeur de type int au système d'exploitation à la fermeture. Il existe de nombreuses autres utilisations de void, consultez ce site Web si vous souhaitez en savoir plus à ce sujet.
void
est un type de données sans valeur. C'est aussi un type de données incomplet qui ne peut pas être complété. Lorsqu'il est utilisé comme type de retour pour une fonction, il indique que la fonction ne renvoie pas de valeur:
void foo(int x);
Utilisé en tant que liste de paramètres, il indique que la fonction ne prend aucun argument:
void bar(void);
Ceci diffère d'une liste de paramètres vide, qui indique que la fonction prend un nombre non spécifié nombre d'arguments (en C; en C++, une liste de paramètres vide revient à utiliser void
):
void bletch();
Aucun objet (variable) ne peut être saisi void
. Cependant, vous pouvez déclarer des pointeurs de type void *
: ce sont des pointeurs "génériques" et peuvent être convertis vers et à partir d'autres types de pointeurs sans conversion explicite. Les fonctions d'allocation de mémoire standard malloc
, calloc
et realloc
retournent toutes void *
:
double *darr = malloc(sizeof *darr * rows);
Dans une implémentation hébergée (essentiellement tout ce qui a un système d'exploitation), main
doit être déclaré comme
int main(void)
ou
int main(int argc, char **argv) // the parameter names can be whatever you want,
// but argc and argv are the usual convention;
// char **argv is equivalent to char *argv[]
ou de d'une autre manière définie par la mise en œuvre ; une implémentation peut accepte
void main()
comme une signature légitime pour main
, mais il doit explicitement documenter cela quelque part .