Pergunta

Inicialmente eu pensei que eu precisava disso, mas eu finalmente evitado. No entanto, a minha curiosidade (e apetite por conhecimento, hum) me faz perguntar:

Pode uma macro pré-processador, por exemplo,

#include "MyClass.h"

INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)

expandir para outro incluem, como em

#include "MyClass.h"

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

?

Foi útil?

Solução

Eu acredito que não pode ser feito, isso é porque o pré-processador é passagem única . Portanto, não pode emitir outras directivas de pré-processamento.

Especificamente, a partir do C99 Padrão (6.10.3.4 nº 3):

3 O resultado completamente pré-processamento de sinal substituiu-macro sequência não é processada como um pré-processamento directiva mesmo que semelhante a uma, ...

Curiosamente, É por isso que o operador _Pragma unário foi adicionado em c99. Porque #pragma não poderia ser emissoras por macros, mas _Pragma lata.

Outras dicas

O padrão C diz o seguinte sobre o pré-processamento directivas (C99 - 6.10 (2) - directivas pré-processamento):

Uma directiva de pré-processamento consiste de uma sequência de símbolos de pré-processamento que começa com um pré-processamento # token que (no início da fase de tradução 4) ...

e (C99 - 6.10 (7)):

Os tokens de pré-processamento dentro de uma directiva de pré-processamento não estão sujeitos a macro expansão, salvo indicação contrária.

Exemplo In:

#define EMPTY
EMPTY # include <file.h>

a seqüência de pré-processamento de sinais na segunda linha não é uma directiva de pré-processamento, porque não começar com um # no início da fase de tradução 4, mesmo que ele vai fazê-lo após a macro VAZIO foi substituído

Então, não, macros não pode expandir-se para um '#include' pré-processamento directiva. Estas directivas precisam estar no lugar no início da fase de tradução 4 (manipulação dessas directivas ocorre pré-processamento acontece). Desde expansão de macro ocorre durante a fase 4, as macros podem não causa algo de existir no início da fase 4.

Eu gostaria de salientar no entanto, que o seguinte não trabalho:

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

#include PLATFORM_HEADER

porque o padrão C diz que este (C99, 6.10.2 (4) - Fonte inclusão de arquivos):

A directiva pré-processamento do formulário

# include pp-tokens new-line

(que não corresponde a uma das duas formas anteriores) é permitido. o pré-processamento fichas depois de incluir na directiva são processados ??tal como no texto normal. (Cada identificador atualmente definido como um nome de macro é substituído pela sua lista de substituição pré-processamento tokens.)

Todas as directivas de pré-processador são interpretados antes da expansão macro começa, de modo nenhum, você não pode ter uma macro expandir-se para uma diretiva #include e tê-lo ser interpretado como tal. Em vez disso, ele será interpretado como (errada) de código C ++.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top