Preprocesador expansión macro a otra directiva de preprocesador
-
12-09-2019 - |
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>;
?
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
se permite# include pp-tokens new-line
(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.