2011-10-23 21 views
14

Posso utilizzare doppi punti in #define? Mi piacerebbe salvare un po 'di scrittura nei file di implementazione, ad es. così:Usa doppio punto (: :) in #define

// foo.h 
#define template template <class T> 
#define foo:: foo<T>:: 

template class foo { 
    T& baz(); 
}; 

#include "foo.tpp" 
#undef template 
#undef foo:: 

// foo.tpp 
template T& foo::baz() { 
    // do stuff. 
} 

Ma ho errori di sintassi che non capisco davvero. (Vedere un esempio su codepad):

Line 11: error: missing whitespace after the macro name
Line 10: error: extra tokens at end of #undef directive
Line 4: error: 'foo' is not a template
compilation terminated due to -Wfatal-errors.

+0

Domanda ben fatta, ma vorrei pubblicare anche gli errori di sintassi –

+5

Questa mi sembra una pessima idea, anche se ha funzionato (che grazie a Dio non lo fa). Nessuno sarebbe in grado di capire o mantenere il tuo codice. I tuoi successori potrebbero attaccare spilli a tua somiglianza. – TonyK

risposta

16

No. Il nome di una macro deve essere un identificatore; non può essere composto da altri personaggi e non può essere costituito da più token.

#define template non valido perché template non è un identificatore, è una parola chiave.

#define foo:: foo<T>:: era valido C90 e C++ 98: definisce una macro denominata foo che viene sostituito da :: foo<T>:: (che non è quello che si vuole fare è, ma è stato valida). Tuttavia, ciò non è valido in C99 e C++ 11 poiché nelle revisioni più recenti dei linguaggi devono esserci spazi bianchi tra il nome di una macro simile all'oggetto e la sua lista di sostituzione (i token con cui è stato sostituito).

Problemi correlati