2009-12-18 8 views

Répondre

15

Je trouve que, une bonne façon de comprendre ce roi de la question, est, au moins avec gcc, d'avoir cette makefile:

defs: 
    g++ -E -dM - < /dev/null 

puis,:

$ make defs 

devrait afficher tous les définitions que vous avez disponibles.

Alors:

$ make defs | grep -i AIX 
$ make defs | grep -i HP 

devrait vous donner la réponse. Exemple pour Linux:

$ make defs | grep -i LINUX 
#define __linux 1 
#define __linux__ 1 
#define __gnu_linux__ 1 
#define linux 1 

Une fois que vous avez trouvé DEFINE que vous recherchez, vous tapez au début de votre code:

#if !(defined(HP_DEFINE) || defined(AIX_DEFINE) || defined(SOLARIS_DEFINE)) 
# error This file cannot be compiled for your plateform 
#endif 
+0

c'était la réponse que je cherchais :) merci – Vijay

+1

Neat ---------- – KeatsPeeks

+1

Très cool - agréable d'apprendre quelque chose de nouveau aujourd'hui. Il convient de noter que tous les systèmes cibles (c'est-à-dire les systèmes embarqués) n'ont pas de macros prédéfinies personnalisées pour gcc. Surtout si vous n'utilisez qu'une génération gcc générique spécifique au CPU (ciblant un processeur plutôt qu'un système) pour générer du code. Dans ce cas, vous devez créer votre propre macro prédéfinie avec l'option -D. – Adisak

4

Que diriez-vous d'une macro passée au compilateur?

i.e. gcc -Dmacro[=defn]

Ensuite, testez la macro dans votre code avec un #ifdef simple #if (si vous avez donné une valeur). Il existe peut-être déjà une macro prédéfinie pour votre plate-forme cible.


[EDIT: Mettez certains de mes commentaires ici dans ma réponse qui expliquent comment -D œuvres]

-Dmacro[=defn] sur la ligne de commande pour le compilateur est le même que celui ayant #define macro defn dans le code. Vous l'étendez comme ceci: -Dfoo=bar est équivalent à #define foo bar. En outre, la définition est facultative, donc -Dfoo est équivalent à #define foo.

+0

pouvez-vous s'il vous plaît expliquer sur ce '-D' – Vijay

+0

' -Dmacro [= defn] 'sur la ligne de commande pour le compilateur est le même que d'avoir' # définir macro defn' dans le code. – Adisak

+0

Vous l'étendez btw ... comme ceci: '-Dfoo = bar' est équivalent à' #define foo bar'. – Adisak

3

Soyez prudent sur la façon dont vous gérer cela. Vous devez identifier les fonctionnalités de l'O/S que vous souhaitez utiliser par fonctionnalité, et non par O/S, et écrire votre code en conséquence. Ensuite, dans un en-tête, vous pouvez identifier les fonctionnalités disponibles sur le système d'exploitation sur lequel vous compilez. C'est la technique utilisée par autoconf, et même si vous n'utilisez pas autoconf elle-même, la technique qu'elle préconise est meilleure que la technique basée sur la plateforme. Souvenez-vous que les fonctionnalités trouvées sur un O/S migrent souvent et deviennent également disponibles sur d'autres. Ainsi, si vous travaillez par fonctionnalités, vous pouvez vous adapter à l'avenir plus facilement que si vous travaillez uniquement sur les O/S.

Vous devez également écrire votre code de manière appropriée et portable. Isolez les dépendances O/S dans des fichiers séparés autant que possible, et codez vers une interface O/S abstraite qui fait ce dont vous avez besoin. Pris à l'extrême, vous vous retrouvez avec une Java JVM; vous n'avez pas besoin d'aller aussi loin, mais vous pouvez éviter la plupart des problèmes.

Jetez un coup d'œil aux bibliothèques portables telles que la bibliothèque Apache Portable Runtime (APR).

Et écrire votre code le long des lignes de:

#ifdef HAVE_PWRITE 
...code using pread() and pwrite()... 
#else 
...code using plain old read() and write()... 
#endif 

Ceci est un exemple grossièrement simpliste - il pourrait y avoir un certain nombre de solutions de repli avant l'utilisation, lire en clair() et write(). Néanmoins, c'est le concept utilisé dans le code le plus portable - des choses comme GCC et Apache et ainsi de suite.

0

Peut-être une solution moins compliquée que certains de ceux suggérés est de consulter Pre-defined C/C++ Compiler Macros. Ce site fournit une liste étendue de macros de compilateurs pour un grand nombre de combinaisons compilateur/OS/Architecture.