Gestion des #defines dans les fichiers IDL

Cette page décrit pourquoi les symboles définis avec un #define disparaître des fichiers H générés par le compilateur MIDL, et ce qui peut être fait à ce sujet. Cette explication s’applique à tous les fichiers traités par MIDL, tels que les fichiers *.idl, *.acf, *.h.

La disparition des symboles #define est due au fait que MIDL a délégué le prétraitement des fichiers d’entrée à un préprocesseur. Par défaut, le préprocesseur est un préprocesseur C/C++ de l’environnement de génération. Après le prétraitement, le flux d’entrée que MIDL reçoit n’a que #line directives de préprocesseur. En particulier, le préprocesseur déroule toutes les définitions de macros dans les fichiers d’entrée et, par conséquent, MIDL ne peut pas détecter leur présence. Par conséquent, lorsque MIDL réplique des définitions de type à partir d’un fichier d’entrée vers le fichier H généré, les #defines ne sont pas répliquées. Par conséquent, n’utilisez pas #defines directement dans les fichiers IDL s’ils doivent être utilisés ultérieurement à partir du fichier H généré.

Les quatre solutions de contournement suivantes sont recommandées :

  • Utilisez la spécification de déclaration const .
  • Utilisez des fichiers d’en-tête distincts qui sont importés ou inclus dans le fichier IDL, puis inclus dans le code C-source.
  • Utilisez des constantes d’énumération dans le fichier IDL.
  • Utilisez cpp_quote pour reproduire #define dans le fichier d’en-tête généré.

Vous pouvez reproduire des constantes de manifeste à l’aide de la syntaxe de déclaration de constante IDL. Notez que le const dans la déclaration de constante IDL est différent de la sémantique const C/C++ et introduit simplement une constante nommée pour une compilation IDL. Exemple :

const short ARRSIZE = 10

Cet exemple spécifie que ARRSIZE est une constante avec une valeur de 10. Les constantes nommées peuvent être utilisées dans les déclarateurs de tableau IDL et dans d’autres endroits où un programmeur C utiliserait un manifeste défini. En outre, cette syntaxe entraîne la génération de la ligne suivante dans le fichier d’en-tête :

#define ARRSIZE 10

Une autre façon de gérer les instructions **#**define consiste à les empaqueter dans un fichier d’en-tête distinct, soit dans un fichier consacré aux instructions **#**define, soit dans un fichier qui contient uniquement des définitions de type. Un fichier qui contient uniquement des directives de préprocesseur peut être inclus en toute sécurité à la fois par le fichier IDL et les fichiers C-source. Bien que les directives ne soient pas disponibles dans le fichier d’en-tête généré par le compilateur MIDL, le programme C-source peut inclure le fichier d’en-tête distinct. De la même façon, un fichier d’en-tête avec des instructions **#**define et des définitions de type standard peut être importé à partir de votre fichier IDL. Cette approche encapsule les instructions **#**define et typedef en les utilisant dans un fichier H de sorte que les symboles **#**define ne soient pas utilisés directement dans le fichier IDL d’importation. L’importation d’un en-tête ou d’un fichier IDL dans un autre fichier IDL empêche la réplication des instructions typedef vers le fichier H généré par MIDL (qui est contrairement aux instructions **#**include). Cette approche permet au fichier d’en-tête d’origine d’être référencé en toute sécurité à partir du code C le long du fichier H généré sans avoir de problème avec les définitions dupliquées.

L’utilisation de constantes d’énumération dans le fichier IDL est également efficace. Ces constantes peuvent être utilisées dans des expressions constantes dans IDL, par exemple, dans des déclarateurs de tableau. Les constantes d’énumération ne sont pas supprimées pendant les premières phases de la compilation MIDL par le préprocesseur du compilateur C. Les constantes d’énumération sont donc disponibles dans le fichier d’en-tête généré par le compilateur MIDL. Prenons l'instruction suivante :

typedef enum midlworkaround { MAXSTRINGCOUNT = 300 };

Cette instruction ne sera pas supprimée pendant la compilation MIDL par le préprocesseur C et le typedef sera répliqué dans le fichier H généré. La constante MAXSTRINGCOUNT est disponible pour les programmes source C qui incluent le fichier d’en-tête généré par le compilateur MIDL.

Enfin, la directive cpp_quote de MIDL peut être utilisée pour écrire une chaîne arbitraire directement dans le fichier H généré. Par exemple, pour obtenir la constante de manifeste utilisée précédemment sur cette page avec cpp_quote, vous pouvez utiliser l’instruction suivante :

cpp_quote ("#define ARRSIZE 10")

Cette instruction entraîne la génération de la ligne suivante dans le fichier d’en-tête :

#define ARRSIZE 10