2011-10-23 18 views
14

¿Puedo usar dos puntos dobles en #define? Me gustaría guardar algo de escritura en los archivos de implementación, p. como este:Use dos puntos dobles (: :) en #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. 
} 

Pero obtengo errores de sintaxis que realmente no entiendo. (Ver un ejemplo en 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

Pregunta bien hecha, pero publicaría los errores de sintaxis que obtienes también –

+5

Eso me parece una idea realmente mala, incluso si funcionó (lo que gracias a Dios no es así). Nadie podría entender o mantener tu código. Tus sucesores pegarán alfileres a tu semejanza. – TonyK

Respuesta

16

No. El nombre de una macro debe ser un identificador; no puede consistir en otros caracteres y no puede consistir en varios tokens.

#define template no es válido porque template no es un identificador, es una palabra clave.

#define foo:: foo<T>:: era válido en C90 y C++ 98: define una macro denominada foo que se sustituye por :: foo<T>:: (que no es lo que se quiere hacer ', pero era válida ). Sin embargo, esto no es válido en C99 y C++ 11 porque en las revisiones más nuevas de los lenguajes, debe haber espacios en blanco entre el nombre de una macro similar a un objeto y su lista de reemplazo (los tokens con los que se reemplaza).

Cuestiones relacionadas