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 ++预处理器之间的不兼容性,如果是,那么它是否是第一个这样做的功能。
答案 0 :(得分:7)
C和C ++处理器之间存在一些差异。忽略预定义宏和可用系统头文件中的差异,当前版本的C和C ++中出现的一些差异是:
and
和朋友是C ++中的运算符,而不是标识符。这意味着#define and &&
在C中有效,但在C ++中无效,并且意味着#if 1 and 2
在C ++中有效,但在C中无效(除非and
被适当地定义为宏)。false
表达式中允许true
和#if
,但在C中替换为0
(与所有标识符一样)。这意味着#if true
/ { {1}} / C++
/ #else
/ C
扩展为#endif
或C++
,具体取决于语言。但是,与C
和朋友不同,这些不是运营商,因此可以通过and
以任何一种语言重新定义。#define
,::
和.*
是C ++中的令牌。因此,->*
运算符可用于在C ++中形成它们,但不能在C中形成它们。##
,foo
在C中扩展宏,但在C ++中不扩展。R"x("foo")x"
,foo
在C ++中扩展宏,但在C中不扩展。