Um pré-processador de C ++ é idêntico a um pré-processador de C?

Eu estou querendo saber o quão diferente os pré-processadores para C ++ e C são.

A razão para a pergunta é essa questão em uma questão específica do pré-processador onde o parágrafo do padrão que trata da questão tem um texto diferente (e um número de parágrafo diferente) e também são diferenças em relação às palavras-chave true e false em C ++.

Então, há mais diferenças ou é a única diferença?

Uma extensão da questão seria quando um arquivo de origem é emitido de forma diferente por um pré-processador de C ++ e um pré-processador de C.

O pré-processador C ++ 03 é (pelo menos destinado a ser) semelhante ao pré-processador C antes de C99. Embora o texto e os números de parágrafo sejam ligeiramente diferentes, as únicas diferenças técnicas que estou ciente entre os dois são que o pré-processador de C ++ manipula dígrafos e nomes de caracteres universais, que não estão presentes em C.

A partir de C99, o pré-processador C adicionou alguns novos resources (por exemplo, macros variadic) que não existem na versão atual do C ++. Não me lembro com certeza, mas não acredito que digrafos foram adicionados.

Eu acredito que C ++ 0x irá trazer os dois em linha novamente (pelo menos essa é a intenção). Mais uma vez, os números e as palavras dos parágrafos não serão idênticos, mas acredito que a intenção é que eles funcionem da mesma forma (além de manter as diferenças mencionadas acima).

Eles devem ser o mesmo: C ++ 98 e C ++ 03 devem corresponder ao C90 e C ++ 0x deve corresponder ao C99. Pode haver erros no texto, no entanto.

As macros predefinidas diferem entre os pré-processadores, principalmente para diferenças óbvias de resources de idioma. Por exemplo, compare:

  • C99 N1256 versão 6.10.8 “Nomes de macros predefinidos”
  • C ++ 11 N3337 draft 16.8 “Nomes de macros predefinidos”

Em particular:

  • C requer que você não defina __cplusplus , o C ++ o usa para representar a versão
  • C usa __STDC__ para representar a versão, C ++ diz que a implementação está definida e usa o __cplusplus
  • C tem __STDC_IEC_559__ e __STDC_IEC_559_COMPLEX__ para indicar as características de ponto flutuante, C ++ não e parece replace isso com as constantes por tipo std::numeric_limits::is_iec559
  • C não tem as macros prefixadas com __STDCPP : _STDCPP_STRICT_POINTER_SAFETY__ e __STDCPP_THREADS__

Como mencionado pelo DevSolar, o C11 adicionou muito mais definições que não fazem parte do C ++ 11.