85 votes

Comment est-il possible de ne rien déclarer à l'intérieur de main() en C++ et d'avoir une application fonctionnelle après compilation ?

Lors d'un entretien, j'ai été confronté à une question de ce type :

Votre ami vous a donné un fichier de code source unique qui imprime les nombres de Fibonacci sur la console. Notez que le bloc main() est vide et qu'il ne contient aucune instruction.
Expliquez comment cela est possible (indice : instance mondiale !).

Je veux vraiment savoir comment une telle chose peut être possible ! Merci d'avance

127voto

Nawaz Points 148870

Il est très probablement implémenté comme (ou une variante de celui-ci) :

 void print_fibs() 
 {
       //implementation
 }

 int ignore = (print_fibs(), 0);

 int main() {}

Dans ce code, la variable globale ignore doit être initialisé avant d'entrer dans main() fonction. Maintenant, afin d'initialiser le global, print_fibs() doit être exécuté là où vous pouvez faire n'importe quoi - dans ce cas, calculer les nombres de Fibonacci et les imprimer ! J'ai montré une chose similaire dans la question suivante (que j'avais posée il y a longtemps) :

Notez qu'un tel code n'est pas sûr et doit être évité en général. Par exemple, le code std::cout peut ne pas être initialisé lorsque print_fibs() est exécuté, si c'est le cas, qu'est-ce que std::cout dans la fonction ? Cependant, si dans d'autres circonstances, il ne dépend pas de cet ordre d'initialisation, alors il est sûr d'appeler les fonctions d'initialisation (ce qui est une pratique courante en C et C++).

18voto

Saksham Points 3010

J'espère que cela vous aidera

class cls
{
  public:
    cls()
    {
      // Your code for fibonacci series
    }
} objCls;

int main()
{
}

Ainsi, dès qu'une variable globale de la classe est déclarée, le constructeur est appelé et c'est là que vous ajoutez la logique permettant d'imprimer la série de Fibonacci.

9voto

Mr. Beer Points 170

Oui, c'est possible. Vous devez déclarer une instance globale d'un objet qui calcule les nombres de Fibonacci dans le constructeur de l'objet.

4voto

superarce Points 363

Je connais des exemples comme celui que vous racontez. Une façon de l'obtenir est d'utiliser le modèle de métaprogrammation. En l'utilisant, vous pouvez déplacer certains processus de calcul vers la compilation.

Ici vous pouvez obtenir un exemple avec les nombres de Fibonacci

Si vous l'utilisez dans le constructeur d'une classe statique, vous pouvez écrire les chiffres sans avoir à écrire de code dans la fonction principale.

J'espère que cela vous aidera.

3voto

log0 Points 6367

Des choses peuvent se produire pendant l'initialisation des variables globales/statiques. Le code sera déclenché au démarrage de l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X