Pregunta

Al principio pensé que necesitaba esto, pero finalmente evitado. Sin embargo, mi curiosidad (y el apetito por el conocimiento, el zumbido) me hacen pregunto:

Puede un macro preprocesador, por ejemplo en

#include "MyClass.h"

INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)

ampliar a otro incluir, como en

#include "MyClass.h"

#include "FooTemplate.h"
template class FooTemplate<MyClass>;

?

¿Fue útil?

Solución

Creo que no se puede hacer, esto es debido a que el pre-procesador es una sola pasada . Por lo que no puede emitir otras directivas del preprocesador.

Específicamente, a partir de la Norma C99 (6.10.3.4 párrafo 3):

  

3 El resultante completamente   macro-sustituido preprocesamiento contador   secuencia no se procesa como una   directiva de preprocesamiento incluso si   similar a uno, ...

Curiosamente, esta es la razón por el operador unario _Pragma se añadió a C99. Debido a que no se pudo #pragma emited mediante macros, pero _Pragma lata.

Otros consejos

El estándar C dice esto sobre preprocesamiento directivas (C99 - 6,10 (2) - directivas de preprocesamiento):

  

Una directiva de preprocesamiento consiste en una secuencia de tokens de preprocesamiento que comienza con   un símbolo # preprocesamiento que (al inicio de la fase de traducción 4)   ...

y (C99 - 6,10 (7)):

  

Las fichas de pre-procesamiento dentro de una directiva de preprocesamiento no están sujetos a la macro   la expansión a menos que se indique lo contrario.

     

Ejemplo En:

#define EMPTY
EMPTY # include <file.h>
     

la secuencia de procesamiento previo de fichas en la segunda línea no es una directiva de preprocesamiento, ya que no comienza con un # al inicio de la fase de traducción 4, a pesar de que lo hará después de la macro VACÍO ha sido reemplazado

Así que no, las macros pueden no expandirse en una directiva de preprocesamiento '#include'. Esas directivas tienen que estar en su lugar al comienzo de la fase de traducción al 4 (manipulación de dichas directivas se lleva a cabo el preprocesamiento sucede). Dado que se produce la expansión de macros durante la fase 4, las macros no pueden causar algo de existir en el inicio de la fase 4.

Me gustaría señalar sin embargo, que la siguiente hace de trabajo:

#ifdef WIN32
#define PLATFORM_HEADER "platform/windows/platform.h"
#else
#define PLATFORM_HEADER "platform/linux/platform.h"

#include PLATFORM_HEADER

debido a que el estándar de C dice esto (C99, 6.10.2 (4) - Fuente archivo de inclusión):

  

Una directiva de preprocesamiento de la forma

# include pp-tokens new-line
     se permite

(que no coincide con una de las dos formas anteriores). el preprocesamiento   fichas después incluyen en la directiva se procesan igual que en el texto normal. (Cada   identificador actualmente se define como un nombre de macro se sustituye por su lista de reemplazo de   preprocesamiento de fichas.)

Todas las directivas del preprocesador se interpreta antes de que comience la expansión de macros, así que no, no se puede tener una macro se expanda en una directiva # include y tiene que ser interpretado como tal. En su lugar, se interpreta como código ++ (errónea) C.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top