Comment déclarer en C/C++ que le code écrit doit être construit dans HP-UX, Solaris ou AIX?Déclaration de la saveur Unix en C/C++
Répondre
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
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
.
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.
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.
- 1. Déclaration implicite de fonction dans C UNIX
- 2. Debian cc flat_namespace
- 3. Quelle est la saveur POSIX de regex utilisée par Perl?
- 4. Comment installer MinGW dans openSUSE, la saveur de Linux?
- 5. MessageBox.Show saveur qui apparaît dans la barre des tâches
- 6. PHP Mail, champ CC
- 7. Que signifie CC? = Dans un Makefile?
- 8. Copier la liste de projets de construction de bac CC
- 9. Assistance avec le script de traitement CC
- 10. Processus fork avec CC .NET
- 11. UNIX - aide de makefile!
- 12. PHPMailer, serveur CC et Linux
- 13. en cas d'erreur de déclaration
- 14. commad unix en php
- 15. Déclaration de structure en C
- 16. Déclaration de tableaux en C#
- 17. en utilisant la déclaration avec enum?
- 18. J'ai deux questions en utilisant la question de la déclaration
- 19. déclaration d'ami en C++
- 20. Commande XEmacs pour passer à l'accolade correspondante en mode cc
- 21. utilisation de la déclaration d'importation
- 22. déclaration avant en C++
- 23. Commandes Unix (vs) Unix
- 24. IF Déclaration en VBA
- 25. List.AddRange déclaration en ligne
- 26. Est-ce que je peux fusionner les attributs de la saveur locale de Django?
- 27. droit associativité ne fonctionne pas avec la déclaration de déclaration
- 28. Que fait l'option `cc`` -ldl` dans la commande suivante?
- 29. double $ déclaration en php
- 30. Déclaration de la classe PHP
c'était la réponse que je cherchais :) merci – Vijay
Neat ---------- – KeatsPeeks
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