【问题标题】:Use double colons (::) in #define在#define 中使用双冒号 (::)
【发布时间】:2011-10-23 00:05:43
【问题描述】:

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

【问题讨论】:

  • 问得很好,但我也会发布您遇到的语法错误
  • 这对我来说似乎是一个非常糟糕的主意,即使它有效(感谢上帝它没有)。没有人能够理解或维护您的代码。你的继任者会像你一样坚持。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-09-14
    • 2016-11-04
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多