【问题标题】:Why am I getting "error: expected '}'" in C++ but not in C?为什么我在 C++ 中得到“错误:预期的 '}'”,但在 C 中却没有?
【发布时间】:2013-09-02 17:12:23
【问题描述】:

当我在以下 C++ 源代码中编译时,我得到 "error: expected '}'" '^' 指向的位置:

typedef enum { false, true } Boolean;
               ^

当我将它编译为 C 源代码时,我没有收到此错误。

这是什么原因?我被难住了!

【问题讨论】:

  • 您不能将名称 falsetrue 赋予 C++ 中的任何内容。请注意,bool 已经是 C++ 中的一个类型,falsetrue 是它的值。
  • 为什么要用枚举重新创建 bool?
  • C99 中也有bool(包括<stdbool.h>)。
  • @user2738698: 不,人们定义他们自己的 bool 使用与 C++ 已经提供的名称相同的名称,是导致问题的原因
  • 哦,我的意思是随着时间的推移而开发的代码,其中最初被认为是二进制的变量会突然变得更加复杂,就像这样:link

标签: c++ c enums boolean


【解决方案1】:

falsetrue 是 C++ 关键字,因此您不能将它们用作 enum 标识符。

在 C 中它们不是关键字,因此您的代码可以工作,但如果您包含 <stdbool.h>,那么它将无法编译,因为该标头将 falsetrue 定义为宏。

请注意,您可能不应该自己实现布尔类型。 C++ 已经有了bool 类型,如果您使用的是C99 编译器,则可以包含stdbool.h。这将为您提供具有 falsetrue 值的 bool 类型,类似于 C++。

【讨论】:

  • 将“可能不需要”替换为“不应该”?
  • 如果你#include <stdbool.h> 它将肯定编译失败; typedef enum { false, true } Boolean; 将扩展为 typedef enum { 0, 1 } Boolean;
【解决方案2】:

要解决这个问题,您需要这样做:

#ifdef __cplusplus
  typedef bool Boolean;
#else
  typedef enum { false, true } Boolean;
#endif

这样,您就不会尝试在 enum 中使用 C++ 关键字(truefalse)。

【讨论】:

  • 不,现在即使在 C 语言中也有布尔数据类型。只需包含 stdbool.h 就足够了,然后您可以使用与 C++ 相同的 typedef。更好的是从一开始就使用bool
  • 要解决这个问题,您应该编写 C 或 C++。编写有效 C 和有效 C++ 的代码的需求实际上非常少。
【解决方案3】:

truefalse 是 C++ 中的关键字。您不能在枚举标识符中使用它们。

正如标准中所说:

2.12 关键字 [lex.key]

表 4 中显示的标识符保留用作关键字(即,它们在阶段 7 中被无条件地视为关键字),但在属性标记中除外。

在表 4 中:

 false
 ...
 true

在 C 中,它们不是关键字,您的代码应该可以工作,但最好是包含已经定义了 truefalse<stdbool.h>,然后您不需要自己定义它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多