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
表达式中允许使用false
和true
,但在C中替换为0
(与所有标识符一样)。这意味着#if true
/C++
/#else
/C
/#endif
扩展为C++
或C
,具体取决于语言。 然而,和朋友不同,这些不是运算符,因此可以用#define
在任何一种语言中重新定义。 -
::
,.*
和->*
是C ++中的标记。 因此,##
运算符可用于在C ++中形成它们,但不能在C中形成它们。 - 原始字符串文字在C ++中可用,但在C中不可用。因此,给定宏
foo
,R"x("foo")x"
在C中扩展宏,但在C ++中不扩展。 - hex浮点常量在C中可用,但在C ++中不可用。 结果,给定一个宏
foo
,0x1p+foo
在C ++中扩展宏,但不在C中扩展。