Un preprocessore C ++ è identico a un preprocessore C?

Mi chiedo quanto siano diversi i preprocessori per C ++ e C.

La ragione della domanda è questa domanda su una domanda specifica del preprocessore in cui il paragrafo dello standard che indirizza la domanda ha una formulazione diversa (e un numero di paragrafo diverso) e anche la differenza riguardante le parole chiave true e false in C ++.

Quindi, ci sono più differenze o questa è l’unica differenza.

Un’estensione della domanda sarebbe quando un file sorgente viene emesso in modo diverso da un preprocessore C ++ e da un preprocessore C.

Il preprocessore C ++ 03 è (almeno destinato a essere) simile al preprocessore C prima di C99. Sebbene i numeri di testo e di paragrafo siano leggermente diversi, le uniche differenze tecniche di cui sono a conoscenza tra i due sono che il preprocessore C ++ gestisce i grafi e i nomi dei caratteri universali, che non sono presenti in C.

A partire da C99, il preprocessore C ha aggiunto alcune nuove funzionalità (ad esempio, macro variadic) che non esistono nella versione corrente di C ++. Non ricordo per certo, ma non credo che siano stati aggiunti i digrammi.

Credo che C ++ 0x riporterà i due in linea (almeno questo è l’intento). Ancora una volta, i numeri e la formulazione del paragrafo non saranno identici, ma credo che l’intento sia che dovrebbero funzionare allo stesso modo (a parte conservare le differenze sopra menzionate).

Dovrebbero essere uguali: C ++ 98 e C ++ 03 dovrebbero corrispondere a C90 e C ++ 0x dovrebbe corrispondere a C99. Ci possono essere bug nel testo, però.

Le macro predefinite differiscono tra i preprocessori, principalmente per ovvie differenze nelle caratteristiche del linguaggio. Ad esempio confrontare:

  • C99 N1256 bozza 6.10.8 “Nomi macro predefiniti”
  • C ++ 11 N3337 bozza 16.8 “Nomi macro predefiniti”

In particolare:

  • C richiede di non definire __cplusplus , il C ++ lo usa per rappresentare la versione
  • C usa __STDC__ per rappresentare la versione, C ++ dice che è stata definita l’implementazione e usa invece __cplusplus
  • C ha __STDC_IEC_559__ e __STDC_IEC_559_COMPLEX__ per indicare le caratteristiche in virgola mobile, C ++ no e sembra sostituirlo con le costanti per tipo std::numeric_limits::is_iec559
  • C non ha le macro precedute da __STDCPP : _STDCPP_STRICT_POINTER_SAFETY__ e __STDCPP_THREADS__

Come accennato da DevSolar, C11 ha aggiunto molte altre definizioni che non fanno parte di C ++ 11.