2011-10-23 134 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無效,因爲template不是標識符,而是關鍵字。

#define foo:: foo<T>::在C90有效和C++ 98:它定義了一個名爲foo宏被替換:: foo<T>::(這不是你想要做什麼,但它是有效)。但是,這在C99和C++ 11中是無效的,因爲在新語言版本中,對象類宏的名稱與其替換列表(替換它的標記)之間必須有空格。