【问题标题】:Can't use "not", "or", or "plus" as identifier?不能使用“not”、“or”或“plus”作为标识符?
【发布时间】:2011-06-06 14:14:38
【问题描述】:

我试图编译这个:

enum class conditional_operator { plus, or, not };

但显然 GCC (4.6) 认为这些是特殊的,而我找不到一个标准来说明它们是特殊的(C++0x n3290 或 C99 n2794 都不是)。我正在使用g++ -pedantic -std=c++0x 进行编译。这是编译器的便利吗?我该如何关闭它? -std=c++0x不应该关闭这个“功能”吗?

PS:嗯,显然,MarkDown 代码格式也是这么想的……

【问题讨论】:

  • 有趣的是代码如何正确地将ornot 着色为保留但将plus 分开:) 就个人而言,我更倾向于放弃使用||&& orand (resp),更少与位运算符混淆。
  • 我的同事正在编写使用orand 作为成员函数名称的代码。我急切地等待他尝试并大声哭泣。

标签: c++ c++11 keyword reserved-words


【解决方案1】:

看看 2.5。它们是||! 的替代标记。

顺便说一句,还有很多其他替代令牌。

编辑:包含它们的基本原理与三元组相同:允许使用非 ASCII 字符集。委员会试图摆脱它们(至少是三元组,我不记得是否有替代令牌),并且遇到了使用它们的人(主要是 IBM 大型机用户)的反对。

为完整性编辑:正如其他人所说,plus 不在该类中,除非您是 using namespace std,否则应该不是问题。

【讨论】:

  • 标准部分+1,尽管@Jon 的链接已经让我找到它。
【解决方案2】:

这些实际上是defined as alternative tokens(和保留),奇怪的是,作为运算符的替代表示。我相信这最初是为了帮助那些使用键盘的人,这使得相关符号难以产生,尽管这似乎是向语言添加额外关键字的一个非常糟糕的理由:(

可能有一个 GCC 编译器选项来禁用它们,但我不确定。

(如 cmets 中所述,plus 应该没问题,除非您使用的是 std 命名空间。)

【讨论】:

  • 从技术上讲,它们不是关键字(在预处理器中的效果不同)。
  • @AProgrammer:啊,我只是在浏览我链接到的页面。你的术语(“替代代币”)是最好用的吗?我认为它们仍然以与关键字相同的方式保留?
  • 是第2.5节和表2的标题。
【解决方案3】:

ornot 分别是 ||! 的替代表示。您不能将它们关闭,也不能将这些标记用于其他任何用途,它们是语言的一部分(当前的 C++,甚至不仅仅是 C++0x)。 (参见 ISO/IEC 14882:2003 2.5 [lex.digraph] 和 2.11 [lex.key] / 2。)

除非您使用using namespace std;using std::plus;,否则您应该安全使用plus

【讨论】:

  • +1 第一个指出plus 应该是安全的。
【解决方案4】:

标准在 2.11 中列出了关键字。还有一个与保留的关键字列表分开的替代表示列表,不能以其他方式使用,但不是关键字。 andor 在该列表中。第 17.4.3 节描述了对使用库的程序的限制,第 17.4.3.1.3 节描述了在标头中使用外部链接声明的名称在 std:: 和全局命名空间中都保留。

换句话说,你不必去 C++0x 来解决这些问题。 andor 已经保留,并且标头 <functional> 包含 plus 作为模板结构类型,因此如果 <functional> 直接或间接地是 #included,则 plus 是禁区。

我不确定将这么多东西转储到全局命名空间中是否真的明智,但这就是标准所说的。

【讨论】:

  • 哇,替代表示表在下一页:s。我也不知道plus 问题。我猜我得求助plus_opor_opnot_op...
  • 我认为说plus 是禁区有点强。它“安全地”嵌入在 std 命名空间中。
  • @Charles Bailey:17.4.3.1.3/1:“在标头中声明为具有外部链接的对象的每个名称都保留给实现以指定具有外部链接的库,两者都在命名空间 std并在全局命名空间中。”我也觉得很奇怪。
  • 但是类模板不是对象。我认为您误解了本节。它指的是coutcerrclogcinerrno 之类的东西,而不是类和模板。我想不出任何其他人,但我敢肯定还有其他人。
【解决方案5】:

这是 1995 年对 C90 标准的修订。编译器可能会选择如何处理这个问题。 GCC 可能包含标头作为标准库的一部分。微软没有,你必须包含iso646.h

这是一个link 维基百科关于此的内容。

【讨论】:

  • 不过,这个问题是关于 C++ 的。
  • @Charles: 但这实际上是它在 C++ 标准中的原因,因为它最初是在 C 中(如果我理解正确的话,我之前错了......)
  • 维基上有一个关于 C++ 的部分。
猜你喜欢
  • 2020-04-03
  • 1970-01-01
  • 2019-01-11
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
相关资源
最近更新 更多