Main() en c++ sous dev-cpp

Résolu/Fermé
Messages postés
179
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
11 janvier 2013
-
Messages postés
179
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
11 janvier 2013
-
Bonjour, ça fait un moment que je programme en c++ avec dev-cpp, et dé-que je commence un nouveau projet console il commence par :
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv [ ] )

mais d'après les liver que j'ai lu, un programme c++ commence juste par:
# inclu.........
main()
et donc si vous pouver me renseigner sur le role de la differentes de ces deux lignes, merci beaucoup,et à plus

9 réponses

mrd9991 bonjour!

Le C++ a beaucoup évolué depuis ses débuts, et en particulier, la notion de name space (espace de noms) n'a pas toujours existé.
A cela ce sont ajoutés les STL ou Standard template library rendues possibles par la notion de "template" qui elle non plus n'a pas toujours existé.
Ces deux éléments n'existent pas en C et leur utilisation permet de se démarquer du C en utilisant des éléments plus puissants du langage.

Dans ton cas, cela se traduit pas deux choses :
1) Les fichiers à inclure ne sont pas les mêmes
Au lieu de faire
#include stdlib.h>
On fait
#include <cstdlib>
et au lieu de faire
#include <stdio.h> pour les entrée sorties à la mode "C"
on fait
#include <iostream>
En gros, tout ce qui était fait dans les fichiers avec extension .h sont les anciennes versions, qui pour une bonne part, sont utilisables dans des programmes en C également, et qui n'utilisent ni les namespace ni les STL.
2) On déclare utiliser les noms de l'espace de noms
Dans le cas de tous ces fichiers sans extension, les déclarations sont toutes dans un name space

Par exemple, si su veut écrire un message sur la sortie standard, les nouveau objets d'entré sortie permettent d'écrire :
cout << "Envoi d'un message";

Mais si tu ne mets pas la directive du début :
using namepace std

tu aura une erreur disant que cout n'existe pas ou n'est pas déclaré
Bien sûr, on peut toujours faire :
std::cout << "Envoi d'un message";

ou bien, si tu ne veux pas répéter à chaque fois std::cout, mais tu ne veux pas utiliser tous les noms du namespace std (risque de conflit de noms par exemple)
tu peux mettre, au lieu de using namesapce std, des déclarations comme :
using std::cout;


Pour ce qui est de la ligne int main(int argc, char *argv), elle est aussi valide en C qu'en C++. Par contre, beaucoup de compilateur C++ n'accepterons pas une déclaration contenant juste main() :
il faudrait au moins la valeur de retour, comme int main();
En conclusion je pense que le livre que tu as lu doit être ancien, ou bien c'est un livre de C !
A quoi servent les argument de la fonction main() ?
Là, c'est comme en langage C :
le premier argument de type int est le nombre d'arguments de la ligne de commande qui a servi à lancer le programme. C'est donc la taille du tableau argv.

Le deuxième est un tableau de chaînes de caractères, dont la première est le nom de l'exécutable, et les autres des éléments tapés ensuite séparés par des espaces.

Allez, je te fais un cadeaux qui explique mes dires (je vais finir par concurrencer le site du zéro non ?)
#include <iostream>
// la sortie standard
using std::cout;
// le retour à la ligne
using std::endl;
// note ;
// on aurait bien sûr pu remplacerles using std:: par un seul using namespace std;

/* Ce petit prog C++  affiche le nombre d'arguments de la ligne
 * de commande et chacun des arguments
 * Le premier argument est le nom complet de l'exécutable lancé
 */
 int main(int argc, char *argv[])
{
	std::cout << "Nombres d'arguments :" << argc << endl;
	std::cout << "Les arguments : " << endl;
	for (int i = 0; i < argc; ++i)
	{
		cout << "argument[" << i << "] = " << argv[i] << endl; 
	}
}
Messages postés
179
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
11 janvier 2013
7
salut, merci beaucoup cher ami java4ever pour votre superbe explication, grace à vous j'ai en fin compris ce que ça veut dire ces phrases au début de programme,nottament 'using namespace std',et ça surtous lorsque j'ai essayer votre programme, et je dois vous dire que je n'est jamis cru que (int argc, char *argv[]) ce sont deux tableaux, apropos de deuxième je pense que j'ai bien compris de quoi il s'agit , mais apropos de premier je ne sais pas ce que est un 'argument de la ligne de commande', en tous cas merci encore une fois beaucoup pour votre aide, c'est vraiment gentil ce que tu as fait, au revoir.
Content que ça te convienne mrd9991
Attention, argc n'est pas un tableau, c'est une valeur entière (un nombre)
C'est seulement la taille du tableau qui suit, c'est à dire argv.
En effet, en C++, on ne peut pas connaître la taille d'un tableau comme argv parce qu'un réalité c'est un pointeur, c'est à dire l'adresse mémoire du début du tableau. Il faut donc, pour connaître son nombre d'éléments, une information donnant sa taille : c'est à ça que sert argc.
En résumé :
la déclaration
int main(int argc, char *argv[])

désigne la méthode principale appelée quand on lance le programme et :
Exemple d'exécution du prog que je t'ai passé :
C:\mesdev\Cpp\essai\Debug>projtestcpp.exe
Nombres d'arguments :1
Les arguments :
argument[0] = projtestcpp.exe
capito ?
Messages postés
179
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
11 janvier 2013
7
salut, merci encore pour votre explication, je pense que j'ai compris, argc est une valeur entière qui désigne la taille de deuxième tableau argv qui contien un seul élément l'exécutable de projet, apropos le livre que j'ai lu il s'appelle 'programmation en c++' c'est de la serie schaum's par l'auteur 'john hubbard' il est super sauf qu'il est impeut ancien, merci pour votre patience, bonne nuit.
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 331
Non, argv contient l'ensemble des arguments passer à la ligne de commande. Issu du monde windows, ça peut te paraitre un peu étrange. En reprenant l'exemple :
C:\mesdev\Cpp\essai\Debug>projtestcpp.exe --display -s toto.txt
Nombres d'arguments :4
Les arguments :
argument[0] = projtestcpp.exe
argument[1] = --display
argument[2] = -s
argument[3] = toto.txt
Messages postés
179
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
11 janvier 2013
7
salut, merci mon frère Snipeur pour ton explication, mais je pense que je suis encore impeut faible pour bien comprendre ces chose là, en tous lé cas j'ai bien appris des nouvelles choses de vous, alors merci beaucoup et à+ , au revoir.
> j'ai en fin compris ce que ça veut dire ces phrases au début de programme,nottament 'using namespace std'

Faire du C++ sans avoir lu un bouquin et savoir ce qu'est un namespace, on croit rêver !!!!
Messages postés
681
Date d'inscription
jeudi 11 juin 2009
Statut
Membre
Dernière intervention
5 janvier 2015
100
hé staff on est pas obligé de savoir ce qu'est un namespace pour savoir utiliser un name space
Messages postés
179
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
11 janvier 2013
7
salut,oui tu as raison chèr DrNitro le plus important pour programmer en c++ c'est savoir utiliser ce qu'il ya comme fonction et mot clèf et opérateurs dans la bibliothèque de c++, bien sure c'est bien de tous savoir, et c'est ce que j'ai essayer de faire en posant cette question alors je tu remercier.
mais ce n'est pas comme tu dis chèr staff j'ai poser cette question par ce que j'ai pas réussi à trouver la réponse ailleurs mème dans le livre que j'ai lu il ne parle pas des namespaces, il est super mais un peu ancien, la première imprission à été faite avant 1998,on tous cas si je me trompe pas je pense que ce forum est fait pour ces choses là, tu sais par fois on a pas le choix.
on tous cas merci beaucoup tous les deux pour avoir donnés de votre temps c'est vraiment gentille de aider les autres, au revoir.