Condividi tramite


Gestione delle #defines nei file IDL

In questa pagina vengono descritti i motivi per cui i simboli definiti con un #define scompaiono dai file H generati dal compilatore MIDL e le operazioni che possono essere eseguite. Questa spiegazione si applica a tutti i file elaborati da MIDL, ad esempio *.idl, *.acf, *.h file.

La scomparsa dei simboli #define è il risultato di MIDL delegando la pre-elaborazione dei file di input a un preprocessore. Per impostazione predefinita, il preprocessore è un preprocessore C/C++ dall'ambiente di compilazione. Dopo la pre-elaborazione, il flusso di input MIDL riceve solo #line direttive del preprocessore. In particolare, il preprocessore annulla la registrazione di tutte le definizioni di macro nei file di input e pertanto MIDL non può rilevare la presenza. Di conseguenza, quando MIDL replica le definizioni dei tipi da un file di input al file H generato, il #defines non viene replicato. Pertanto, non usare #defines direttamente nei file IDL se devono essere usati in un secondo momento dal file H generato.

Sono consigliate le quattro soluzioni alternative seguenti:

  • Usare la specifica della dichiarazione const .
  • Usare file di intestazione separati importati o inclusi nel file IDL e successivamente inclusi nel codice sorgente C.
  • Usare le costanti di enumerazione nel file IDL.
  • Usare cpp_quote per riprodurre #define nel file di intestazione generato.

È possibile riprodurre costanti manifesto usando la sintassi di dichiarazione costante IDL. Si noti che il const nella dichiarazione costante IDL è diverso dalla semantica const C/C++ e introduce semplicemente una costante denominata per una compilazione IDL. Ad esempio:

const short ARRSIZE = 10

In questo esempio viene specificato che ARRSIZE è una costante con un valore pari a 10. Le costanti denominate possono essere usate nei dichiaratori di matrice IDL e in altre posizioni in cui un programmatore C userebbe una definizione del manifesto. Questa sintassi comporta inoltre la generazione della riga seguente nel file di intestazione:

#define ARRSIZE 10

Un altro modo per gestire le istruzioni **#**define consiste nel creare un pacchetto in un file di intestazione separato, in un file dedicato alle istruzioni **#**define o in un file che contiene solo definizioni di tipo. Un file che contiene solo direttive del preprocessore può essere incluso in modo sicuro sia dal file IDL che dai file di origine C. Anche se le direttive non saranno disponibili nel file di intestazione generato dal compilatore MIDL, il programma C-source può includere il file di intestazione separato. In modo analogo, un file di intestazione con istruzioni **#**define e definizioni di tipi regolari può essere importato dal file IDL. Questo approccio incapsula le istruzioni **#**define e typedef usandole in un file H in modo che i simboli **#**define non vengano usati direttamente nel file IDL di importazione. L'importazione di un file di intestazione o IDL in un altro file IDL impedisce che le istruzioni typedef vengano replicate nel file H generato da MIDL (diversamente dalle istruzioni **#**include). Questo approccio consente di fare riferimento al file di intestazione originale dal codice C lungo il file H generato senza che si sia verificato un problema con le definizioni duplicate.

Anche l'uso delle costanti di enumerazione nel file IDL è efficace. Queste costanti possono essere usate nelle espressioni costanti in IDL, ad esempio nei dichiaratori di matrice. Le costanti di enumerazione non vengono rimosse durante le fasi iniziali della compilazione MIDL dal preprocessore C-compiler, pertanto le costanti di enumerazione sono disponibili nel file di intestazione generato dal compilatore MIDL. Si consideri la seguente istruzione:

typedef enum midlworkaround { MAXSTRINGCOUNT = 300 };

Questa istruzione non verrà rimossa durante la compilazione MIDL dal preprocessore C e il typedef verrà replicato nel file H generato. La costante MAXSTRINGCOUNT è disponibile per i programmi di origine C che includono il file di intestazione generato dal compilatore MIDL.

Infine, la direttiva cpp_quote di MIDL può essere usata per scrivere una stringa arbitraria direttamente nel file H generato. Ad esempio, per ottenere la costante del manifesto usata in precedenza in questa pagina con cpp_quote, è possibile usare l'istruzione seguente:

cpp_quote ("#define ARRSIZE 10")

Questa istruzione comporta la generazione della riga seguente nel file di intestazione:

#define ARRSIZE 10