2011-10-23 19 views
14

Czy mogę używać podwójnych dwukropków w #define? Chciałbym zapisać niektóre zapisy w plikach implementacji, np. tak:Używaj podwójnych dwukropków (: :) w #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. 
} 

Ale dostaję błędy składniowe, których tak naprawdę nie rozumiem. (patrz przykład na 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

Dobrze zadane pytanie, ale chciałbym opublikować błędy składniowe, które otrzymujesz. –

+5

To wygląda mi na naprawdę zły pomysł, nawet jeśli zadziałało (to dzięki Bogu, że tak nie jest). Nikt nie będzie w stanie zrozumieć ani utrzymać twojego kodu. Twoi następcy będą przylepiać szpilki do twojego podobieństwa. – TonyK

Odpowiedz

16

Nr Nazwa makro musi być identyfikatorem; nie może składać się z innych postaci i nie może składać się z wielu tokenów.

#define template jest nieprawidłowy, ponieważ template nie jest identyfikatorem, jest słowem kluczowym.

#define foo:: foo<T>:: była ważna w C90 i C++ 98: definiuje makro o nazwie foo, który jest zastąpiony przez :: foo<T>:: (to nie to, co chcesz zrobić, ale to było ważny). Jest to jednak nieważne w C99 i C++ 11, ponieważ w nowszych wersjach językowych musi istnieć biały odstęp między nazwą makra podobnego do obiektu a listą zastępczą (tokenami, z których jest on zastępowany).