What are the differences between the C and C++ preprocessors? [duplicate]

自作多情 提交于 2019-12-09 10:06:34

问题


Are there any differences in behaviour between the C and C++ preprocessors?

They are defined by different passages of standards text (section 6.10 of the C standard and section 16 of the C++ standard).

My motivation for asking this is that a proposal for making the single quote a digit separator that was recently accepted into C++14 extends the C++ preprocessor grammar to accomodate this change (specifically, it extends the definition of a pp-number), and I'm wondering whether this introduces an incompatibility between the C and C++ preprocessors, and if so, whether it's the first feature to do so.


回答1:


There are some differences between the C and C++ processors. Ignoring the differences in predefined macros and available system headers, some differences that come to mind in the current versions of C and of C++ are:

  • and and friends are operators, not identifiers, in C++. This means #define and && is valid in C, but not in C++, and means #if 1 and 2 is valid in C++, but not in C (unless and is suitably defined as a macro).
  • false and true are allowed in C++ #if expressions, but replaced by 0 (like all identifiers) in C. This means #if true/C++/#else/C/#endif expands to either C++, or C, depending on the language. Unlike and and friends, though, these are not operators, so may be redefined by #define in either language.
  • ::, .*, and ->* are tokens in C++. As a result of that, the ## operator can be used to form them in C++, but not in C.
  • Raw string literals are available in C++, but not in C. As a result, given a macro foo, R"x("foo")x" expands the macro in C, but not in C++.
  • Hexadecimal floating-point constants are available in C, but not in C++. As a result, given a macro foo, 0x1p+foo expands the macro in C++, but not in C.


来源:https://stackoverflow.com/questions/21515608/what-are-the-differences-between-the-c-and-c-preprocessors

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!