Compilation & Directives de préprocesseur Pointeurs, Références & Allocation Dynamique de Mémoire Spécificités du C++ (indépendantes de la POO) Structures & Classes Encapsulation des données Constructeur & Destructeur de classe Copie d'objets Amitié & Surcharge d'opérateur Héritage (Partie 1) Héritage (Partie 2) Patrons de fonctions et de classes Introduction à la librairie standard
Retour menu principal

Compilation & Directives de Préprocesseur


Mécanismes de compilation

  1. Précompilation : consiste à traiter, à parser les fichiers sources avant compilation (résolution des directives de préprocesseur i.e. remplacement de macros, suppression de texte, inclusion de fichiers…)

    g++ -E fichier_source.cc

Mécanismes de compilation

  1. Précompilation
  2. Compilation séparée : traduction du code en langage machine.

    g++ -c fichier_source.cc

    Cette opération conduit à la création d’un fichier objet d’extension .o (ici fichier_source.o).

Mécanismes de compilation

  1. Précompilation
  2. Compilation séparée
  3. Édition de liens : consiste à regrouper la totalité des données de même que les fichiers objets et les bibliothèques (fonctions de la bibliothèque standard et des autres bibliothèques externes) ainsi qu’à résoudre les références inter-fichiers.

    g++ fichier_source1.o fichier_source2.o… -o fichier_executable

Mécanismes de compilation

  • Les trois précédentes étapes peuvent être réalisées en une seule opération via la commande

    g++ fichier_source1.cc fichier_source2.cc… -o fichier_executable

  • Le binaire ainsi généré fichier_executable peut alors être exécuté depuis le répertoire local

    ./fichier_executable

Options de compilation

  • l'option -Ichemin indique au compilateur où sont localisés les fichiers d’en-têtes nécessaires à la compilation séparée du programme. Par défaut, le compilateur recherche ces fichiers localement et dans le répertoire /usr/include,
  • l'option -W permet l’activation des messages de mise en garde. Différents niveaux sont accessibles, le plus complet étant -Wall -Wextra,
  • l'option -Didentificateur permet la définition d’identificateur à fournir lors du processus de précompilation. L’activation des directives de préprocesseur peut se faire par ce biais.

Démystifier la command ccc

Directives de préprocesseur

Le préprocesseur recherche des directives de compilation repérées en début de ligne par le symbole # et se terminant avec la fin de la ligne

#directive [paramètre]

Par exemple,

#include <iostream>
#define PI 3.141592

Utilisation de directives de condition

Il est possible de contrôler ce qui sera compilé effectivement ou non, avec les clauses de condition :

#if condition
...
#endif

Le code compris dans la séquence #if#endif est considéré par le compilateur seulement si la condition est vraie (non nulle).

Exemple (1/2)

  • test_debug.cc

    #include <iostream>
    using namespace std;
    
    int main()
    {
    #if (DEBUG == 1)
      cout << "DEBUG: "
           << "Mode debug du programme" << endl;
    #else
      cout << "NOTICE: "
           << "Mode normal du programme" << endl;
    #endif
    }
    

Compilation :

g++ -DDEBUG=1 test_debug.cc -o test_debug

Exemple (2/2)

  • dummy.h

    #ifndef _dummy_h_
    #define _dummy_h_ 1
    void dummy();
    #endif
    
  • dummy.cc

    #include "dummy.h"
    void dummy() {}
    
  • test_dummy.cc

    #include "dummy.h"
    int main()
    {
      dummy();
    }
    

Compilation :

g++ dummy.cc test_dummy.cc -o test_dummy