Vos seulement deux options, que je peux penser, sont à rouler votre propre version de iso_c_binding
pour les systèmes qui ne disposent pas de ce module (as suggested by @HighPerformanceMark) ou d'utiliser préprocesseurs pour compiler conditionnellement parties de votre code en fonction de la version du compilateur. Dans les deux cas, vous devrez travailler pour vous assurer que votre code est portable sur tous les systèmes. Comme suggéré par @HighPerformanceMark, vous pouvez copier et coller une implémentation open-source de iso_c_binding
, mais pour chaque nouveau système, vous devez vous assurer que cette implémentation est correcte.
Selon la façon dont vous voulez que votre code se comporter si iso_c_binding
est pas avaiable Je recommanderais d'utiliser la méthode de préprocesseur. Vous déclarez que "je ne peux pas me permettre de vérifier simplement la version de GCC puisque je peux utiliser d'autres compilateurs". Cependant, toutes vos options nécessiteront un travail de votre part pour maintenir votre code pour une utilisation sur différents systèmes, la méthode du préprocesseur nécessite, dans mon opionion, la moindre quantité de travail.
Le code suivant détermine la version du compilateur à l'aide du préprocesseur et peut être utilisé pour compiler le code de manière conditionnelle en fonction de la version minimale du compilateur. Pour gfortran:
Si GNU Fortran invoque le préprocesseur, __GFORTRAN__
est défini et __GNUC__
, __GNUC_MINOR__
et __GNUC_PATCHLEVEL__
peut être utilisé pour déterminer la version du compilateur.
Dans un fichier, disons precomp.inc
J'inclurais un certain nombre de vérifications de précompilateurs qui déterminent les fonctions à inclure dans votre code. Par exemple, je voudrais vérifier la version du compilateur et, si elle prend en charge l'utilisation du module iso_c_binding
je définirais une macro de préprocesseur HAS_ISO_C_BINDING
(ou similaire). Le fichier precomp.inc
peut ensuite être inclus dans d'autres parties de votre code. Ce fichier pourrait ressembler à:
!> \file precomp.inc
!! Preprocessor feature detection.
#if defined(__GFORTRAN__)
#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3
#define HAS_ISO_C_BINDING 1
#else
#define HAS_ISO_C_BINDING 0
#endif
#elif defined(__INTEL_COMPILER)
#error "I haven't implemented this yet..."
#else
#error "Compiler not yet supported."
#endif
L'erreur dans la clause #else
finale pourrait être remplacé par HAS_ISO_C_BINDING=0
, si vous voulez être en mesure de compiler sans support pour le module iso_c_binding.
Votre source de Fortran ressemblerait à quelque chose comme
program main
#include 'precomp.h'
#if HAS_ISO_C_BINDING
use iso_c_binding
#endif
implicit none
! Some code...
#if HAS_ISO_C_BINDING
! Code which depends on iso_c_binding
#else
! Fallback code
#end if
! Some more code...
end program main
Encore une fois, la bonne méthode à utiliser dépend de la façon dont vous voulez coder pour compiler si iso_c_binding
n'est pas avaiable. Si votre code doit être compilé sur des systèmes sans ce module, la réponse de @ HighPerformanceMark est probablement meilleure. Si vous pouvez simplement déclencher une erreur lors de la compilation ou si vous avez un code de repli si iso_c_binding
n'est pas disponible alors j'utiliserais cette méthode de préprocesseur car cela ne nécessite qu'une vérification supplémentaire pour chaque nouveau compilateur que vous devez utiliser.
Vérifiez si '#ifdef iso_c_binding' etc ... –
fonctionne Compile un programme simple qui utilise les choses dont vous avez besoin de' ISO_C_BINDING'. S'il est compilé et exécuté, vous pouvez ajouter une définition de symbole de préprocesseur à un fichier d'en-tête de configuration. Faites cette partie de votre procédure de construction de code. C'est ainsi que GNU 'autoconf' le fait dans les scripts' configure'. –
Est-il possible de faire quelque chose comme ça avec CMake? – sunmat