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

时间:2014-02-02 20:11:59

标签: c++ c c-preprocessor standards

C 和C ++预处理器之间的行为是否存在差异?

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

我提出这个问题的动机是,最近被C ++ 14接受的proposal for making the single quote a digit separator扩展了C ++预处理器语法以适应这种变化(具体来说,它扩展了 pp-number的定义< / em>),我想知道这是否会引入 C 和C ++预处理器之间的不兼容性,如果是,那么它是否是第一个这样做的功能。

1 个答案:

答案 0 :(得分:7)

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

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