我可以在#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上的示例):
第11行:错误:宏名称后缺少空格 第10行:错误:#undef指令结束时的额外令牌
第4行:错误:'foo'不是模板
由于-Wfatal-errors导致编译终止。
答案 0 :(得分:16)
没有。宏的名称必须是标识符;它不能由其他字符组成,也不能由多个标记组成。
#define template
无效,因为template
不是标识符,而是关键字。
#define foo:: foo<T>::
在C90和C ++ 98中有效:它定义了一个名为foo
的宏,它被:: foo<T>::
取代(这不是你想要做的,但它是< EM>有效)。但是,这在C99和C ++ 11中无效,因为在较新的语言版本中,类对象宏的名称与其替换列表(替换它的标记)之间必须有空格。