Salut,
Envoyé par
ptyxs
A propos du titre de ce fil : main() n'est pas une 'méthode' mais une fonction, à ce qu'il me semble...
(Du reste, par parenthèses, j'ai l'impression qu'en C++ le terme 'méthode', employé pour désigner une fonction définie dans une classe (donc pas main()), tombe en désuétude : dans les bouquins de Stroustrup, Meyers etc. ce terme est inexistant ou très rare, du moins d'après mes souvenirs...)
Typiquement, on accorde au terme méthode le fait de représenter une fonction membre ayant un comportement polymorphe (le fait que la fonction soit déclarée "virtual" pour faire simple) alors que pour tout autre type de fonction (libre ou membre et non polymorphe) on utilisera de préférence le terme fonction.
Mais tout cela n'est que du à la sensibilité des gens
Envoyé par
guendalf
Pendant qu'on y est avec les réponses expertes sur les formes autorisées du main... quelqu'un pourrait m'expliquer pourquoi on ne peut pas faire :
int main(int argc, std::string argv[])
Parce qu'être encore obligé de manipuler des char* en C++ en 2009, c'est dommage je trouve, non ?
Je vois plusieurs raisons à cela, mais peut-être fais-je tout à fait fausse route...
En premier lieu, nous pourrions nous appesantir sur le poids de l'héritage issu du C, car il n'y a, à ma connaissance, aucune différence lors du lancement d'une application écrite en C par rapport à une application écrite en C++.
Java et C# travaillant "derrière" une machine virtuelle, il était possible d'envisager le changement, mais, étant donné que nous sommes limités, pour le lancement de l'application, aux différentes bibliothèque du runtime (kernell32 dans le cas de windows), et en attente d'une uniformisation de l'ABI C++, il peut sembler "cohérent" de s'en tenir au dénominateur "le plus grand commun multiple", à savoir... l'interface C
La deuxième raison que je soupçonne est de ne pas vouloir ajouter une dépendance là où elle n'est pas forcément nécessaire:
Si l'on suivait le raisonnement jusqu'au bout, nous pourrions presque envisager de faire en sorte que le prototype de la fonction devienne
int main(std::vector<std::string> argv)
mais cela impliquerait une dépendance forcée vis à vis de la classe string et de la classe vector, alors... que ce serait peut être le seul endroit (accessible au départ de main, s'entend) où elle pourrait s'avérer nécessaire
Enfin, comme l'a fait valoir Médinoc, peut être n'est ce "simplement" que parce que la classe string n'est pas binairement compatible
Il me semble qu'il était question de lancer une "traque" à toutes les fonctions C++ manipulant encore des chaines de caractères C style afin de les remplacer par leur équivalent manipulant des std:: (w)string, mais, si l'on peut, effectivement envisager de remplacer le constructeur d'un i/o fstream, un remplacement similaire au niveau de main nécessiterait une refonte en profondeur de l'existant sur les différents système.
Et comme il est plus "sensé" de faire en sorte qu'un langage s'adapte (sans trop de mal) aux environnements sur lesquels il est employé que de demander aux différents environnements de s'adapter aux exigences d'un langage (surtout si le langage en question a vocation à rester "aussi près que possible" du matériel)...
Partager