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

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.
}

但我遇到了一些语法错误,实际上不太理解。(可参考这个示例):

第11行:错误:宏名称后缺少空格
第10行:错误:#undef指令结尾处有额外的标记
第4行:错误:'foo'不是一个模板
编译因-Wfatal-errors而终止。


问题问得很好,但我会发表您遇到的语法错误。 - James Webster
5
对我来说,这看起来是一个非常糟糕的想法,即使它能够运行(感谢上帝它不能)。没有人能够理解或维护你的代码。你的继任者们会把针插在你的像中。 - TonyK
1个回答

16

不可以。宏的名称必须是一个标识符,不能包含其他字符,也不能由多个标记组成。

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

#define foo:: foo<T>:: 在 C90 和 C++98 中有效:它定义了一个名为 foo 的宏,该宏被替换为 :: foo<T>::(这不是你想要做的事情,但却是有效的)。然而,在 C99 和 C++11 中,此方法无效,因为在新版本的语言中,对象型宏的名称和其替换列表之间必须有空格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接