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

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

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

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

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

  • and朋友是C ++中的运算符,而不是标识符。 这意味着#define and &&在C中有效,但在C ++中无效,并且意味着#if 1 and 2在C ++中有效,但在C中无效(除非and适当地定义为宏)。
  • 在C ++ #if表达式中允许使用falsetrue ,但在C中替换为0 (与所有标识符一样)。这意味着#if true / C++ / #else / C / #endif扩展为C++C ,具体取决于语言。 然而,和朋友不同,这些不是运算符,因此可以用#define在任何一种语言中重新定义。
  • ::.*->*是C ++中的标记。 因此, ##运算符可用于在C ++中形成它们,但不能在C中形成它们。
  • 原始字符串文字在C ++中可用,但在C中不可用。因此,给定宏fooR"x("foo")x"在C中扩展宏,但在C ++中不扩展。
  • hex浮点常量在C中可用,但在C ++中不可用。 结果,给定一个宏foo0x1p+foo在C ++中扩展宏,但不在C中扩展。