est-il meilleur que ?


Je me demande ce que signifie " meilleur " ?

Si " meilleur " signifie que vous pouvez l'utiliser à la fois en C et en C++, alors gagne facilement, puisque vous ne pouvez pas utiliser en C. Ce serait une réponse courte et ennuyeuse, et le robot Quora la mangerait, alors supposons que vous utilisez C++.


Si " meilleur " signifie plus sûr, alors gagne. The following code will crash (or at least, it’ll perform undefined behaviour):

  1. short x; 
  2. scanf("%d", &x); 

Many modern compilers will warn you about this, but it’s not actually part of the standard to do so. Je passerais un pointeur à un nombre de 16 bits, et scanf() le traiterait comme un nombre de 32 bits (enfin, sur la plupart du matériel, etc, etc).

Il y a une flopée de problèmes similaires avec stdio - c'est assez sûr si vous savez vraiment ce que vous faites, mais étonnamment peu de grands programmes C l'utilisent réellement.

Si "meilleur" signifie plus classiquement orienté objet, alors stdio gagne sans doute. Everything is encapsulated as a FILE pointer, and one can, sort of, argue that the functions taking FILE* as the first argument are examples of message passing.

  1. fprintf(f, “This might be a file, or a console!n”); 

But equally, iostream has a rich inheritance tree, and allows custom iostream transports to be built by simple inheritance of streambuf, for example. De plus, il gère mieux les nouveaux types. Dans l'ensemble, donc, je dirais qu'iostream a l'avantage ici, même si la syntaxe de l'inserteur n'est pas très classique.

  1. out << "Mais alors, cela aussi." << std::endl; 

If “better” means quicker to build, it’s stdio for sure. Iostream est une vaste étendue de modèles, et ceux-ci prennent effectivement beaucoup plus de temps à compiler que de simples appels de fonction.

Si "meilleur" signifie plus rapide... Eh bien, alors vous seriez pardonné de penser que c'est forcément le stdio sémantiquement simple. Et vous auriez tort, parce que de vastes étendues de iostream sont une bibliothèque de modèles, et donc principalement triées au moment de la construction. Pour tout ce qui est un tant soit peu complexe - et certainement tout ce qui implique des types personnalisés - iostream est plus rapide, puisqu'il supprime des dizaines d'appels de fonctions et peut spécialiser l'insertion appelée pour le type pendant la construction, laissant un temps d'exécution étonnamment serré. J'ai entendu une fois Bjarne Stroustrup expliquer cela, et il a dit qu'il était aussi surpris que vous l'êtes probablement maintenant.

Si "meilleur" signifie plus facile à gérer le formatage complexe de la sortie, stdio gagne - à tel point, en fait, qu'il y a des implémentations format-chaîne qui frappent autour qui s'intégreront bien avec iostream (par exemple, boost::format).

Dans l'ensemble, iostream est un gagnant haut la main - bien que vous puissiez vouloir ajouter boost::format ou d'autres bibliothèques en fonction des besoins.