Compartir a través de


Tratar con #defines en archivos IDL

En esta página se describe por qué los símbolos definidos con un #define desaparecen de los archivos H generados por el compilador MIDL y lo que se puede hacer sobre él. Esta explicación se aplica a los archivos procesados por MIDL, como archivos *.idl, *.acf, *.h.

La desaparición de #define símbolos es el resultado de delegar el preprocesamiento de archivos de entrada a un preprocesador. De forma predeterminada, el preprocesador es un preprocesador de C/C++ del entorno de compilación. Después del preprocesamiento, el flujo de entrada QUE RECIBE MIDL solo tiene #line directivas de preprocesador. En concreto, el preprocesador anula la inscripción de todas las definiciones de macros en los archivos de entrada y, por lo tanto, MIDL no puede detectar su presencia. Por lo tanto, cuando MIDL replica las definiciones de tipo de un archivo de entrada en el archivo H generado, el #defines no se replica. Por lo tanto, no use #defines directamente en archivos IDL si se van a usar más adelante desde el archivo H generado.

Se recomiendan las cuatro soluciones alternativas siguientes:

  • Use la especificación de declaración const .
  • Use archivos de encabezado independientes importados o incluidos en el archivo IDL y, posteriormente, incluidos en el código fuente de C.
  • Use constantes de enumeración en el archivo IDL.
  • Use cpp_quote para reproducir #define en el archivo de encabezado generado.

Puede reproducir constantes de manifiesto mediante la sintaxis de declaración constante IDL. Tenga en cuenta que el const de la declaración de constante IDL es diferente de la semántica const de C/C++ y simplemente introduce una constante con nombre para una compilación IDL. Por ejemplo:

const short ARRSIZE = 10

En este ejemplo se especifica que ARRSIZE es una constante con un valor de 10. Las constantes con nombre se pueden usar en declaradores de matriz IDL y en otros lugares donde un programador de C usaría un manifiesto definido. Además, esta sintaxis da como resultado la siguiente línea que se genera en el archivo de encabezado:

#define ARRSIZE 10

Otra manera de controlar las instrucciones **#**define es empaquetarlas en un archivo de encabezado independiente, ya sea en un archivo dedicado a las instrucciones **#**define o en un archivo que solo contiene definiciones de tipo. Un archivo que solo contiene directivas de preprocesador puede incluirse de forma segura tanto en el archivo IDL como en los archivos de código fuente de C. Aunque las directivas no estarán disponibles en el archivo de encabezado generado por el compilador MIDL, el programa de código fuente C puede incluir el archivo de encabezado independiente. De forma similar, se puede importar un archivo de encabezado con instrucciones **#**define y definiciones de tipo normales desde el archivo IDL. Este enfoque encapsula las instrucciones **#**define y typedef mediante su uso en un archivo H para que los símbolos **#**define no se usen directamente en el archivo IDL de importación. La importación de un archivo de encabezado o IDL en otro archivo IDL impide que las instrucciones typedef se repliquen en el archivo H generado por MIDL (que contrasta con las instrucciones **#**include). Este enfoque permite que el archivo de encabezado original se haga referencia de forma segura desde el código C a lo largo del archivo H generado sin tener ningún problema con las definiciones duplicadas.

El uso de constantes de enumeración en el archivo IDL también es eficaz. Estas constantes se pueden usar en expresiones constantes en IDL, por ejemplo, en declaradores de matriz. Las constantes de enumeración no se quitan durante las primeras fases de la compilación MIDL mediante el preprocesador del compilador de C, por lo que las constantes de enumeración están disponibles en el archivo de encabezado generado por el compilador MIDL. Considere la instrucción siguiente:

typedef enum midlworkaround { MAXSTRINGCOUNT = 300 };

El preprocesador de C no quitará esta instrucción durante la compilación MIDL y la definición de tipo se replicará en el archivo H generado. La constante MAXSTRINGCOUNT está disponible para los programas de código fuente C que incluyen el archivo de encabezado generado por el compilador MIDL.

Por último, la directiva cpp_quote de MIDL se puede usar para escribir una cadena arbitraria directamente en el archivo H generado. Por ejemplo, para obtener la constante de manifiesto usada anteriormente en esta página con cpp_quote, se puede usar la siguiente instrucción:

cpp_quote ("#define ARRSIZE 10")

Esta instrucción da como resultado la siguiente línea que se genera en el archivo de encabezado:

#define ARRSIZE 10