Freigeben über


Umgang mit #defines in IDL-Dateien

Auf dieser Seite wird beschrieben, warum Symbole, die mit einem #define definiert wurden, aus den vom MIDL-Compiler generierten H-Dateien verschwinden und was dagegen getan werden kann. Diese Erklärung gilt für alle Dateien, die von MIDL verarbeitet werden, z. B. *.idl-, *.acf-, *.h-Dateien.

Das Verschwinden von #define Symbolen ist das Ergebnis der Delegierung der Vorverarbeitung von Eingabedateien an einen Präprozessor durch MIDL. Standardmäßig ist der Präprozessor ein C/C++-Präprozessor aus der Buildumgebung. Nach der Vorverarbeitung verfügt der Von MIDL empfangene Eingabestream nur über #line Präprozessordirektiven. Insbesondere hebt der Präprozessor die Registrierung aller Makrodefinitionen in Eingabedateien auf, sodass MIDL deren Vorhandensein nicht erkennen kann. Wenn MIDL Daher Typdefinitionen aus einer Eingabedatei in die generierte H-Datei repliziert, werden die #defines nicht repliziert. Verwenden Sie daher #defines nicht direkt in IDL-Dateien, wenn sie später aus der generierten H-Datei verwendet werden sollen.

Die folgenden vier Problemumgehungen werden empfohlen:

  • Verwenden Sie die Const-Deklarationsspezifikation.
  • Verwenden Sie separate Headerdateien, die importiert oder in der IDL-Datei enthalten sind und später im C-Quellcode enthalten sind.
  • Verwenden Sie Enumerationskonstanten in der IDL-Datei.
  • Verwenden Sie cpp_quote , um #define in der generierten Headerdatei zu reproduzieren.

Sie können Manifestkonstanten mithilfe der IDL-Konstantendeklarationssyntax reproduzieren. Beachten Sie, dass die Const in der IDL-Konstantendeklaration sich von der C/C++- Const-Semantik unterscheidet und einfach eine benannte Konstante für eine IDL-Kompilierung einführt. Beispiel:

const short ARRSIZE = 10

In diesem Beispiel wird angegeben, dass ARRSIZE eine Konstante mit dem Wert 10 ist. Benannte Konstanten können in IDL-Arraydeklaratoren und an anderen Stellen verwendet werden, an denen ein C-Programmierer ein Manifest definiert. Darüber hinaus führt diese Syntax dazu, dass die folgende Zeile in der Headerdatei generiert wird:

#define ARRSIZE 10

Eine weitere Möglichkeit zum Behandeln von **#**define-Anweisungen besteht darin, sie in einer separaten Headerdatei zu packen, entweder in eine Datei, die **#**define-Anweisungen gewidmet ist, oder in eine Datei, die nur Typdefinitionen enthält. Eine Datei, die nur Präprozessordirektiven enthält, kann sowohl in der IDL-Datei als auch in den C-Quelldateien sicher eingeschlossen werden. Obwohl die Direktiven in der vom MIDL-Compiler generierten Headerdatei nicht verfügbar sind, kann das C-Source-Programm die separate Headerdatei enthalten. Auf ähnliche Weise kann eine Headerdatei mit **#**define-Anweisungen und regulären Typdefinitionen aus Ihrer IDL-Datei importiert werden. Dieser Ansatz kapselt die **#**define- und typedef-Anweisungen, indem sie in einer H-Datei verwendet werden, sodass die **#**define-Symbole nicht direkt in der importierenden IDL-Datei verwendet werden. Das Importieren eines Headers oder einer IDL-Datei in eine andere IDL-Datei verhindert, dass die typedef-Anweisungen in die von MIDL generierte H-Datei repliziert werden (im Gegensatz zu **#**include-Anweisungen). Dieser Ansatz ermöglicht es, sicher auf die ursprüngliche Headerdatei aus dem C-Code entlang der generierten H-Datei zu verweisen, ohne ein Problem mit duplizierten Definitionen zu haben.

Die Verwendung von Enumerationskonstanten in der IDL-Datei ist ebenfalls effektiv. Diese Konstanten können in konstanten Ausdrücken in IDL verwendet werden, z. B. in Arraydeklaratoren. Enumerationskonstanten werden während der frühen Phasen der MIDL-Kompilierung durch den C-Compiler-Präprozessor nicht entfernt, sodass Enumerationskonstanten in der vom MIDL-Compiler generierten Headerdatei verfügbar sind. Betrachten Sie folgende Anweisung:

typedef enum midlworkaround { MAXSTRINGCOUNT = 300 };

Diese Anweisung wird während der MIDL-Kompilierung vom C-Präprozessor nicht entfernt, und die Typedef wird in die generierte H-Datei repliziert. Die Konstante MAXSTRINGCOUNT ist für C-Source-Programme verfügbar, die die vom MIDL-Compiler generierte Headerdatei enthalten.

Schließlich kann die cpp_quote-Direktive von MIDL verwendet werden, um eine beliebige Zeichenfolge direkt in die generierte H-Datei zu schreiben. Um beispielsweise die zuvor auf dieser Seite verwendete Manifestkonstante mit cpp_quote abzurufen, kann die folgende Anweisung verwendet werden:

cpp_quote ("#define ARRSIZE 10")

Diese Anweisung führt dazu, dass die folgende Zeile in der Headerdatei generiert wird:

#define ARRSIZE 10