web-dev-qa-db-fra.com

Est-ce que main avec liste de paramètres vide est différent de main avec une liste de paramètres vide?

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()?

9
Joseph Lee

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.

11
Omkant

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é.

2
Ravi

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.

2
lunadir

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.

1
Kevin

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 .

0
John Bode