Pouvez-vous imprimer quelque chose en C ++, avant d'entrer dans la fonction principale? p>
C'est une question d'entrevue à Bloomberg: P>
4 Réponses :
#include <iostream> struct X { X() { std::cout << "Hello before "; } } x; int main() { std::cout << "main()"; } This well-formed C++ program prints Hello before main() You see, the C++ standard guarantees that the constructors of namespace-scope variables (in this example, it's x) will be executed before main(). Therefore, if you print something in a constructor of such an object, it will be printed before main(). QED
La réponse manque à une pièce: comment pouvez-vous être sûr que STD :: Cout est en sécurité à utiliser à ce stade?
@awoodland uhm ... parce que la standard garantit-elle? (Réclamation difficile, je vais essayer de prouver :)
27.4.1 / 2 Dans le projet N3242, je n'ai pas de C ++ 03 ou N3290 disponible: Les objets sont construits et les associations sont établies à un certain temps avant ou pendant la première fois un objet de classe iOS_BASE :: Init est construit et, dans tous les cas avant que le corps de la principale commence l'exécution. Les objets ne sont pas détruits lors de l'exécution du programme. Les résultats d'inclure
@ Davidrodríguez-Dribesas Je pense que vous avez mal compris ce que Dit @awoodland. Il n'y a aucune garantie que std :: cout code> construira avant
x code>.
@Wilhelmtell Je pense que vous avez mal compris cette citation, cela signifie que la norme garantit i> que cout code> sera construite avant
x code> . L'ordre de la construction d'objets de durée statique dans une seule unité de traduction est garanti d'être de haut en bas, et cela signifie que le
iOS_Base :: init code> sera construit avant i >
x code>
@ Davidrodríguez-Dribesas Vous voulez dire, si x code> est inclus après io?
@wilhelmtell je veux dire dans le code dans la réponse et oui, seulement si x code> est défini i> après
iostream code> est inclus, ce qui est le cas ici , ainsi que dans la réponse de Kerrek.
bool b = /*(bool)*/printf("before main");
int main()
{
return 0;
}
@wilhelmtell Quel est le problème avec ça? A CODE> ne peut pas contenir en tant que membre et je devais être paresseux pour écrire une autre classe pour prouver un point.
#include <iostream> std::ostream & o = (std::cout << "Hello\n"); int main() { o << "Now main() runs.\n"; }
Bien sûr, vous ne voulez pas o code> pour être globalement visible:
espace de noms {std :: ostream & o (std :: cout << "Bonjour \ n"); } code> ou
statique STD :: Ostream & O (std :: COUT << "HELLO \ N"); code> mais ce sont des détails.
Si opérateur << () code> Vous avez un problème.
@WILELMMTELL: Vous dites essentiellement que "si des E / S échouent et que vous devez effectuer des E / S avant principal () code>, vous avez un problème." Je suis d'accord.
@WilhelmTell Notez également que par défaut Iostreams ne jetez pas.
#include <iostream> using namespace std; int b() { cout << "before "; return 0; } static int a = b(); int main() { cout << "main\n"; }
Vous devez également vous demander I> de vous montrer a) leurs guides de style de code, et b) un morceau de code représentable de leur codeBase.
@KerReksB: Comme dans une grande organisation (il y a> 3000 développeurs à Bloomberg), la qualité du code varie de mauvais au bien. La question concernant l'exécution du code avant d'entrer
principale () code> n'est pas entièrement non pertinente et une introduction raisonnable. à une discussion sur la construction d'objets accessibles. Est-ce qu'il comporte jour jour-jour? Probablement pas. ... et je serais méfiant de la réponse citée ci-dessus: les variables globales et l'utilisation de
printf () code> me feraient de me demander.