为什么我在 C++ 中得到"error: expected '}'",而在 C 中却没有?
Why am I getting "error: expected '}'" in C++ but not in C?
当我在以下C++源中编译时,我得到了'^'所指向的"error: expected '}'"
:
typedef enum { false, true } Boolean;
^
当我把它编译成C源代码时,我不会得到这个错误。
这是什么原因?我被难住了!
false
和true
是C++关键字,因此不能将它们用作enum
标识符。
在C中,它们不是关键字,因此您的代码可以工作,但如果包含<stdbool.h>
,则它将无法编译,因为该标头将false
和true
定义为宏。
请注意,您可能不应该自己实现布尔类型。C++已经具有bool
类型,如果使用C99编译器,则可以包含stdbool.h
。这将为您提供一个具有false
和true
值的bool
类型,类似于C++。
要解决此问题,您需要执行以下操作:
#ifdef __cplusplus
typedef bool Boolean;
#else
typedef enum { false, true } Boolean;
#endif
这样,就不会试图在enum
中使用C++关键字(true
和false
)。
true
和false
是C++中的关键字。不能在枚举标识符中使用它们。
正如标准中所说:
2.12关键词[lex.key]
表4中所示的标识符被保留用作关键字(即,在阶段7中它们被无条件地作为关键字处理),除了在属性令牌中。
表4:
false ... true
在C中,它们不是关键字,您的代码应该有效,但最好包括已经定义了true
和false
的<stdbool.h>
,然后您不需要自己定义它们。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?
- 在for循环的某些迭代中,字符串的长度为0,而在其他迭代中则不为0
- 为什么带lcov的codecov在Travis上不能正常工作,而在我当地的Linux Mint上却不能正常工作
- 为什么在一个地方需要双倍英镑,而在这个宏观上不需要其他地方?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- 我的代码在发布模式下不起作用,而在Qt的调试模式下工作
- 试图使循环仅检查字符串是否仅数字,而在编程中允许的C IM中允许的负数是一个类项目
- basic_string::替换的超出范围异常,而在范围内,正如调试相同参数的输出所证明的那样
- 循环在此代码中仅迭代一次,而在另一个代码中正确迭代
- 为什么对象在作为指针传递时超出范围,而在返回时则不然
- 为什么友元运算符<<在某些情况下使用,而在其他情况下不使用
- 我们如何有证据表明,声明虚拟函数的类是2个字节,其中一个不超过一个未声明,而在子类中
- 需要在GCC-7.2.0中具有编译错误的代码上的帮助,而在GCC-6.4.0中则不需要编译
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 为什么我在 C++ 中得到"error: expected '}'",而在 C 中却没有?