在#define中使用双冒号(::)

时间:2011-10-23 00:05:44

标签: c++ compiler-errors c-preprocessor

我可以在#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导致编译终止。

1 个答案:

答案 0 :(得分:16)

没有。宏的名称必须是标识符;它不能由其他字符组成,也不能由多个标记组成。

#define template无效,因为template不是标识符,而是关键字。

#define foo:: foo<T>::在C90和C ++ 98中有效:它定义了一个名为foo的宏,它被:: foo<T>::取代(这不是你想要做的,但它是< EM>有效)。但是,这在C99和C ++ 11中无效,因为在较新的语言版本中,类对象宏的名称与其替换列表(替换它的标记)之间必须有空格。