C和C++预处理器之间有什么区别?

HC4*_*ica 10 c c++ standards c-preprocessor

C和C++预处理器之间的行为有什么不同吗?

它们由标准文本的不同段落定义(C标准的第6.10 节和C++标准的第16节).

我要求这样做的动机是,使单引号成为最近被C++ 14接受的数字分隔符提议扩展了C++预处理器语法以适应这种变化(具体来说,它扩展了pp数的定义),以及我想知道这是否会引入C和C++预处理器之间的不兼容性,如果是这样,它是否是第一个这样做的功能.

小智 7

C和C++处理器之间存在一些差异.忽略预定义宏和可用系统头文件中的差异,当前版本的C和C++中出现的一些差异是:

  • and和朋友是C++中的运算符,而不是标识符.这意味着#define and &&在C中有效,但在C++ #if 1 and 2中无效,并且平均值在C++中有效,但在C中无效(除非and适当地定义为宏).
  • false并且true被允许在C++ #if表达式,但所取代0(如所有标识符)中C.这意味着#if true/ C++/ #else/ C/ #endif扩展为C++,或者C,根据语言.与and朋友不同,这些不是运算符,因此可以用#define任何一种语言重新定义.
  • ::,.*和,->*是C++中的令牌.因此,##运算符可以用于在C++中形成它们,但不能在C中形成它们.
  • 原始字符串文字在C++中可用,但在C中不可用.因此,给定宏foo,R"x("foo")x"在C中扩展宏,但在C++中不扩展.
  • 十六进制浮点常量在C中可用,但在C++中不可用.因此,给定一个宏foo,0x1p+foo在C++中扩展宏,但在C中不扩展.

  • @JensGustedt` +`只允许作为pp-number的一部分,如果它遵循`e`或`E`(C++),或`e`,`E`,`p`或'P`(C).如果无条件允许,"1 + 2"将无效.(`0xE + 0xF`由于同样的原因已经无效,这已经有点问题了.) (2认同)
  • @hvd:关键字和运算符不是排他性类别。`sizeof` 是用作运算符的关键字。`and`、`or` 等与关键字分开列出,但它们是“保留的,不得以其他方式使用”;我不确定标准在这些替代表示形式和实际关键字之间有何区别。 (2认同)