que preprocesamiento preprocesador lenguaje informatica ifdef funcion ejemplos directivas directiva define c++ c standards c-preprocessor

preprocesamiento - ¿Es un preprocesador C++ idéntico a un preprocesador C?



que es include en c++ (3)

Me pregunto qué tan diferentes son los preprocesadores para C ++ y C.

El motivo de la pregunta es esta pregunta sobre una pregunta específica del preprocesador donde el párrafo del estándar que aborda la pregunta tiene una redacción diferente (y un número de párrafo diferente) y también una diferencia relativa a las palabras clave true y false en C ++.

Entonces, ¿hay más diferencias o esta es la única diferencia?

Una extensión de la pregunta sería cuándo es un archivo fuente emitido de manera diferente por un preprocesador C ++ y un preprocesador C.


El preprocesador C ++ 03 es (al menos el objetivo) similar al preprocesador C antes de C99. Aunque la redacción y los números de los párrafos son ligeramente diferentes, las únicas diferencias técnicas que conozco entre los dos son que el preprocesador de C ++ maneja los dígrafos y los nombres de los caracteres universales, que no están presentes en C.

A partir de C99, el preprocesador C agregó algunas capacidades nuevas (p. Ej., Macros variadas) que no existen en la versión actual de C ++. No lo recuerdo con certeza, pero no creo que se hayan agregado los dígrafos.

Creo que C ++ 0x pondrá a los dos en línea nuevamente (al menos esa es la intención). De nuevo, los números de los párrafos y la redacción no serán idénticos, pero creo que la intención es que funcionen de la misma manera (aparte de retener las diferencias mencionadas anteriormente).


Se supone que son iguales: C ++ 98 y C ++ 03 deben coincidir con C90, y C ++ 0x debe coincidir con C99. Sin embargo, puede haber errores en la redacción.


Las macros predefinidas difieren entre los preprocesadores, principalmente por diferencias obvias de características del lenguaje. Ej. Compare:

En particular:

  • C requiere que no defina __cplusplus , C ++ lo usa para representar la versión
  • C usa __STDC__ para representar la versión, C ++ dice que la implementación está definida y usa __cplusplus en __cplusplus lugar
  • C tiene __STDC_IEC_559__ y __STDC_IEC_559_COMPLEX__ para indicar características de punto flotante, C ++ no lo hace y parece reemplazarlo con las constantes por tipo std::numeric_limits<float>::is_iec559
  • C no tiene las macros con el prefijo __STDCPP : _STDCPP_STRICT_POINTER_SAFETY__ y __STDCPP_THREADS__

Como menciona DevSolar, C11 agregó muchas más definiciones que no son parte de C ++ 11.