不能使用“not”,“or”或“plus”作为标识符?

时间:2011-06-06 14:14:39

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

我试图编译这个:

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代码格式化也是如此......

5 个答案:

答案 0 :(得分:15)

看看2.5。它们是||!的替代令牌。

还有一堆其他替代令牌BTW。

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

编辑完整性:正如其他人发表评论一样,加上不在该课程中,除非你是using namespace std,否则不应该成为问题。

答案 1 :(得分:7)

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

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

(如评论中所述,除非您使用plus命名空间,否则std应该没问题。)

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

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

换句话说,您不必转到C ++ 0x就可以解决这些问题。 andor已被保留,标头<functional>包含plus作为模板化结构类型,plus因此<functional>是禁止的}直接或间接#include d。

我不确定在全局命名空间中倾倒那么多东西是非常明智的,但这就是标准所说的。

答案 4 :(得分:1)

这是1995年对C90标准的修订。编译器可能会选择如何对此进行操作。 GCC可能包含标题库作为标准库的一部分。使用microsoft时,它不会包含iso646.h

以下是维基百科的link