2012-05-22 180 views
39

He visto información sobre las diferencias entre cosas como iostream vs iostream.h. Por lo que deduje de aquellos, la diferencia entre ellos es que la versión sin la extensión .h no rellenará el espacio de nombres mientras que la versión con la extensión lo hará.C++ - cmath vs math.h (y encabezados de extensión similares a c precedidos c.)

¿Es esto lo mismo para cmath frente a math.h? ¿Por qué es cmath (y muchos otros archivos similares) con el prefijo c en lugar de solo math? ¿Hay más diferencias entre ellos?

¡Gracias por su tiempo!

+0

Véase también http://stackoverflow.com/q/2118422 y http: // stackoverflow.com/q/2587445 para preguntas relacionadas (pero tal vez no engaños). –

Respuesta

22

que he visto alguna información acerca de las diferencias entre cosas como iostream vs iostream.ho.

[iostream.h] no es un encabezado estándar.

no es un ejemplo del problema que estás planteando.

[cmath] define símbolos en el espacio de nombre std, y también puede definir símbolos en el espacio de nombres global. [math.h] define símbolos en el espacio de nombres global, y también puede definir símbolos en el espacio de nombres std. si incluye el primero y usa un símbolo no calificado, puede compilar con un compilador pero no con otro. por lo tanto, es una buena idea usar [math.h]. y, en general, para tales pares de encabezados, para usar la versión [.h].

C++ 98 proporcionó una garantía formal del encabezado c xxx que no contamina el espacio de nombres global. tal vez por eso fueron definidos. sin embargo, eso fue un poco más difícil de implementar que los contaminantes, por lo que en la práctica ninguna implementación de biblioteca estándar que yo conozca siguió el estándar a este respecto, y finalmente se modificó para reflejar la realidad en C++ 11.

+8

'por lo tanto, es una buena idea usar [math.h]. y, en general, para tales pares de encabezados, para usar la versión [.h]. No estoy de acuerdo. La única razón por la que existen las versiones .h es por compatibilidad. Los encabezados C se enumeran debajo de [** depr **. C.headers] por una razón. –

+12

@Jesse: el argumento es que si incluyes 'math.h', entonces * sabes * que estás dejando caer un montón de basura en tu espacio de nombres global. Si incluye 'cmath' entonces * puede o no * estar soltando un montón de basura en su espacio de nombres global. Por el contrario, no te importa si dejas caer un montón de basura en el espacio de nombres 'std', ya que de todos modos nunca defines los símbolos allí. Entonces, la incertidumbre acerca de lo que hace 'math.h' es, en cierto sentido, mejor que la incertidumbre sobre lo que' cmath' hace, independientemente de lo que el comité piense al respecto. –

+0

@Alf: ¿incluso EDG hizo eso mal en C++ 03? Para vergüenza. –

1

Los encabezados cuyos nombres comienzan con c se derivan de los encabezados de la biblioteca estándar C. Los encabezados correspondientes con el prefijo c eliminado y un sufijo .h agregado son idénticos (o casi idénticos) a los encabezados de biblioteca estándar de C.

<cmath> define los símbolos relevantes en el espacio de nombres std; <math.h> los define globalmente.

(acabo de aprender que no es tan sencillo;. Véase la respuesta de Alf)

+3

-1 no, los encabezados que comienzan con 'c' son variantes específicas de C++ de los encabezados de biblioteca estándar de C. ellos no vienen de la biblioteca C Además, no hay garantía de que 'cmath' no defina los símbolos en el espacio de nombres global, y no hay garantía de que' math.h' no defina los símbolos en el espacio de nombres 'std'. –

+1

@ Cheersandhth.-Alf: redacción descuidada de mi parte; No quise decir "de la biblioteca estándar de C" que implica que están * directamente * de la biblioteca estándar de C. No sabía que '' podría definir símbolos globales y '' podría definir símbolos en el espacio de nombres 'std'. Ahora que lo sé, estoy confundido; ¿Por qué el estándar de C++ deja esa implementación definida? –

+0

@KeithThompson: porque refleja la realidad. Muchas implementaciones de bibliotecas estándar lo han hecho durante tanto tiempo. En lugar de forzar a las implementaciones a ser más estrictas sobre este tema (la experiencia muestra que esto no ha funcionado tan bien como podría haberlo hecho), el comité estándar relajó las expectativas de los programadores. –

0

Tal vez esto sería útil:

biblioteca de C++ incluye las mismas definiciones que la biblioteca lenguaje C organizada en la misma estructura de archivos de cabecera, con los siguientes diferencias: Cada archivo de cabecera tiene el mismo nombre como la versión de idioma C pero con un prefijo "c" y sin extensión. Por ejemplo, el equivalente de C++ para el archivo de encabezado del lenguaje C es . Todos los elementos de la biblioteca se definen dentro del espacio de nombres estándar .

c-prefixed vs .h extension headers