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

Use double colons (::) in #define

本文关键字:#define      更新时间:2023-10-16

我可以在#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而终止。

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

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

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