30

I am wondering how different the preprocessors for C++ and C are.

The reason for the question is this question on a preprocessor-specific question where the paragraph of the standard that addresses the question has a different wording (and a different paragraph number) and also are difference concerning the true and false keywords in C++.

So, are there more differences or is this the only difference.

An extension of the question would be when is a source file emitted differently by a C++ preprocessor and a C preprocessor.

Community
  • 1
  • 1
René Nyffenegger
  • 39,402
  • 33
  • 158
  • 293

3 Answers3

20

The C++03 preprocessor is (at least intended to be) similar to the C preprocessor before C99. Although the wording and paragraph numbers are slightly different, the only technical differences I'm aware of between the two are that the C++ preprocessor handles digraphs (two-letter alternative tokens) and universal character names, which are not present in C.

As of C99, the C preprocessor added some new capabilities (e.g., variadic macros) that do not exist in the current version of C++. I don't remember for sure, but don't believe that digraphs were added.

I believe C++0x will bring the two in line again (at least that's the intent). Again, the paragraph numbers and wording won't be identical, but I believe the intent is that they should work the same (other than retaining the differences mentioned above).

SebastianWilke
  • 470
  • 1
  • 4
  • 15
Jerry Coffin
  • 476,176
  • 80
  • 629
  • 1,111
  • other than trigraphs, in C99 digraphs (but `%:` and the "quadrigraph" `%:%:`) are just tokens and not modified further in the preprocessing phase. They are then interpreted by the "real" compiler phases. – Jens Gustedt Feb 23 '11 at 08:33
  • Also about C++03 vs C89, the C++ preprocessor has a special treatment of boolean literals. – Matteo Italia Jan 14 '16 at 07:56
5

Predefined macros differ between the preprocessors, mostly for obvious language feature differences. E.g. compare:

In particular:

  • C requires you not to define __cplusplus, C++ uses it to represent the version
  • C uses __STDC__ to represent the version, C++ says is implementation defined and uses __cplusplus instead
  • C has __STDC_IEC_559__ and __STDC_IEC_559_COMPLEX__ to indicate floating point characteristics, C++ does not and seems replace that with the per type std::numeric_limits<float>::is_iec559 constants
  • C does not have the macros prefixed with __STDCPP: _STDCPP_STRICT_POINTER_SAFETY__ and __STDCPP_THREADS__

As mentioned by DevSolar, C11 added many more defines which are not part of C++11.

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985
  • Erm... you apparently forgot about C11... it's not only C++ that moved ahead. (Especially with regards to thread support and associated macros.) – DevSolar Jun 15 '15 at 15:14
  • 1
    @DevSolar thanks for the tip. Just to confirm: you mean that C11 added many more macros which are not in C++11 is that it? That's my impression on a quick look. Haven't looked into C++14, though, but there is stuff which won't be there for sure like `__STDC_NO_VLA__` – Ciro Santilli OurBigBook.com Jun 15 '15 at 15:19
  • Well, *both* C11 and C++11 added threads, and the preprocessor macros necessary to handle them -- just different ones obviously. And I found it curious that you link C++11 documentation, but (outdated) C99 to compare. ;) – DevSolar Jun 15 '15 at 16:25
  • FYI: Syntax: C: `# non-directive`, C++: `# conditionally-supported-directive`. – pmor Jan 14 '22 at 10:08
5

They are supposed to be the same: C++98 and C++03 should match C90, and C++0x should match C99. There may be bugs in the wording, though.

Jeremiah Willcock
  • 30,161
  • 7
  • 76
  • 78