Compilation conditionnelle

Il est courant en C d’utiliser la compilation conditionnelle, à coup de commandes du pré-processeur telles que #ifdef. Cela permet de modifier le comportement du programme en fonction de la définition ou de la non-définition de macros / constantes.

Cette technique se révèle particulièrement utile lorsqu’on souhaite faire du code portable sur plusieurs OS alors même qu’on utilise des fonctions propres à chaque OS. Un exemple classique l’est la fonction sleep sous Linux qui a pour équivalent Sleep sous Windows. La question est souvent de savoir quelle constante mettre derrière le #ifdef. Une première idée est d’utiliser des constantes « personnelles » et de définir manuellement celles dont on a besoin :

  • Avant de compiler, j’édite mon fichier source et j’écris #define COMPIL_WINDOWS ou #define COMPIL_LINUX selon le cas.
  • Lors de la compilation, j’utilise l’option -D du pré-processeur de gcc pour définir une macro : -DCOMPIL_LINUX

Cette technique est rudimentaire : elle oblige l’utilisateur à éditer les sources ou à connaître l’option nécessaire pour compiler avec son système d’exploitation.

La meilleure solution est d’utiliser les constantes définies par les systèmes d’exploitation eux-mêmes. Plus besoin d’éditer les fichiers sources, plus besoin de connaitre l’option de compilation qui va bien, on peut prévoir les fonctionnements sous différents OS, etc… Comment connaître les macros définies par un OS en particulier ? Il vous suffit de suivre le lien suivant !

http://sourceforge.net/p/predef/wiki/OperatingSystems/

Rien de mieux qu’un petit code exemple :

#include <stdio.h>

int main(void)
{
    #ifdef _WIN32
    printf("Trouve _WIN32");
    #endif
    #ifdef linux
    printf("Trouve linux");
    #endif
    return 0;
}

Je l’ai essayé avec CodeBlocks(MinGW)/Windows XP, gcc/Linux RedHat et gcc/Sun Solaris. Pour les deux premiers, le bon mot est affiché ; pour le dernier, rien se s’affiche (normal).

Vous trouverez ici un exemple complet de code portable utilisant la compilation conditionnelle pour gérer différemment les sockets sous Windows et Linux.

Une Réponse

  1. Pingback: Gestion des erreurs avec les sockets en C | Pierre Gradot

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.