2011-10-23 5 views
14

#defineにダブルコロンを使用できますか?実装ファイルにいくつかの文章を保存したいと思います。#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. 
} 

しかし、私は実際にはわからない構文エラーが発生します。 (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

よくある質問ですが、文法エラーも投稿しています –

+5

それはうまくいかなかったようです。誰もあなたのコードを理解したり維持したりすることはできません。あなたの後継者はあなたの肖像にピンをつけます。 – TonyK

答えて

16

号マクロの名前は識別子でなければなりません。他の文字で構成することはできず、複数のトークンで構成することはできません。 は識別子ではないため、

#define templateは無効です。キーワードです。

#define foo:: foo<T>::はC90に有効だったとC++ 98:それは(それはあなたがやりたいことはありませんが、それは有効た):: foo<T>::に置き換えられfooという名前のマクロを定義します。ただし、C99およびC++ 11では無効です。言語の新しいリビジョンでは、オブジェクトのようなマクロの名前とその置換リスト(置き換えられるトークン)の間に空白が必要です。

関連する問題