¿Por qué se importa el mapa como #include <map>
, pero stdio se importó como #include <stdio.h>
?¿Por qué algunos incluyen necesitan el .h y otros no?
Respuesta
Todos los encabezados estándar de C++ no quieren el .h
al final. Leí en alguna parte que el concepto es que ellos no tienen que ser archivos reales, aunque nunca vi una implementación hacerlo de otra manerade edición: en realidad las características intrínsecas del compilador debe trabajar teniendo en cuenta las cabeceras incluidas, pero no incluirlos como archivos; ver @Yttrill del comentario.
Para la cosa stdio.h
, en una aplicación C++ no debe incluir <stdio.h>
, pero en su lugar debe incluir <cstdio>
. En general, no debe incluir los encabezados C "normales", pero sus contrapartes C++ --ized, que no tienen el .h
al final, tienen un c
al frente y ponen todos los símbolos definidos en ellos en el std
espacio de nombres. Por lo tanto, <math.h>
se convierte en <cmath>
, <stdlib.h>
se convierte en <cstdlib>
, y así sucesivamente.
En general, debe usar las versiones en C++ de los encabezados C para evitar contaminar el espacio de nombres global (suponiendo que no sea uno de esos tipos que ponen using namespace std;
en todas partes) y para beneficiarse de algunas mejoras de C++ en el cabezales C estándar (p. ej., sobrecarga añadida a algunas funciones matemáticas).
En general, la implementación de todo esto se hace simplemente teniendo tales archivos sin extensión en el directorio en el que el compilador busca los archivos de encabezado. En mi g ++ 4.4 instalación, por ejemplo, usted tiene:
[email protected]:/usr/include/c++/4.4$ ls
algorithm cstdarg functional sstream
array cstdatomic initializer_list stack
backward cstdbool iomanip stdatomic.h
bits cstddef ios stdexcept
bitset cstdint iosfwd streambuf
c++0x_warning.h cstdio iostream string
cassert cstdlib istream system_error
ccomplex cstring iterator tgmath.h
cctype ctgmath limits thread
cerrno ctime list tr1
cfenv cwchar locale tr1_impl
cfloat cwctype map tuple
chrono cxxabi-forced.h memory typeinfo
cinttypes cxxabi.h mutex type_traits
ciso646 debug new unordered_map
climits deque numeric unordered_set
clocale exception ostream utility
cmath exception_defines.h parallel valarray
complex exception_ptr.h queue vector
complex.h ext random x86_64-linux-gnu
condition_variable fenv.h ratio
csetjmp forward_list regex
csignal fstream set
El C++ - Ized cabeceras C en teoría podría ser sólo una
namespace std
{
#include <original_C_header.h>
};
pero en general son más complicados para hacer frente a la aplicación específica problemas (especialmente con respecto a las macros) y para agregar funcionalidad relacionada con C++ (véase, por ejemplo, el ejemplo anterior de sobrecargas añadidas en <cmath>
).
Por cierto, el estándar de C++ (§D.5) no dicen que los
<c***>
cabeceras deben comportarse como si se incluyen las cabeceras
<***.h>
en una directiva
namespace std
, sino todo lo contrario:
Para compatibilidad con la biblioteca estándar C, la biblioteca estándar de C++ proporciona los encabezados [...] 18 C Cada encabezado C, cuyo nombre tiene el nombre de forma.h, se comporta como si cada nombre colocado en el espacio de nombres de la biblioteca estándar por el correspondiente El encabezado cname también se coloca dentro del ámbito del espacio de nombres del espacio-nombre std y va seguido de una declaración explícita de uso (7.3.3)
Tenga en cuenta que este tipo de cabeceras se consideran obsoleta (§C.2.1), por lo que esta es la razón principal por la que no debería usarlos:
C.2.1 Las modificaciones a las cabeceras de Para la compatibilidad con la biblioteca Standard C, la biblioteca estándar de C++ proporciona los 18 encabezados C (D.5), pero su uso está en desuso en C++.
Dado que Matteo en realidad no proporcionó ningún motivo para usar las versiones C++ de los encabezados estándar C, daré uno: Los encabezados C++ a menudo proporcionan versiones sobrecargadas de las funciones de biblioteca estándar C, que están optimizadas para el tipo de datos real de los argumentos. C también proporciona estas versiones múltiples, pero todas tienen diferentes nombres (por ejemplo, 'abs' vs' fabs' contra 'fabs' contra' fabsl'). Hace una diferencia con '#include
@Ben Voigt: curiosamente, lo agregué de forma independiente en la última revisión (después de echar un rápido vistazo al archivo 'cmath') :) –
contaminación del espacio de nombres no es en realidad una razón para usar la versión C++ de los encabezados, ya que nadie en su sano juicio usaría nombres que entren en conflicto con la biblioteca estándar de C –
Es simplemente el nombre del archivo real en el disco. No hay (probablemente) ningún archivo llamado map.h
o stdio
en su directorio de inclusión estándar.
La biblioteca estándar de C++ se alejó del estilo anterior de usar .h
para no tener .h
al final de los nombres de archivo. Esto puede posiblemente se han relacionado con lo que la sintaxis se parecen más a las plantillas:
#include<vector>
vector<int> v;
(comentario preventiva:. Sí, sé que las necesidades anteriores std::
para construir, pero es sólo un ejemplo)
No quiero rechazar una respuesta de la competencia, pero esto es realmente inexacto: no hay garantía de que los archivos 'map' o' stdio.h' existan en el disco. –
Eso es cierto, no hay garantía. Sin embargo, la mayoría de los compiladores almacenan los encabezados de las bibliotecas estándar como archivos en el disco; sin duda, los populares comúnmente disponibles. –
Claro, esa es la opción de implementación obvia. No renuncié, solo quería observar que "es simplemente el nombre del archivo real en el disco" no es estrictamente exacto en lo que respecta al estándar. –
Es solo la forma en que está definido por el estándar C++: como ocurre, map
y stdio.h
ni siquiera tienen que ser archivos reales.
Como nota al margen, stdio.h
es el encabezado que se importó originalmente a C++ desde las bibliotecas estándar de C: la versión de C++ es cstdio
. En términos prácticos, esto generalmente significa que cuando incluye cstdio
, obtiene el material de stdio.h
, pero está en el espacio de nombres estándar.
Solo para aclarar: el stdio.h
que incluye en C++ es la versión en C++ de lo que originalmente era un encabezado en C. Pero la forma C++ de escribir el include es cstdio
.
No, '#include
@Ben: De hecho, expresé esto incorrectamente, quise decir que es la forma de escribir estilos C-C++, y no pone cosas en namespace std. –
- 1. ¿Por qué algunos idiomas necesitan Boxeo y Unboxing?
- 2. ¿Por qué palabra clave "paquete" y .h?
- 3. ¿Por qué easy_install extrae algunos huevos de pitón y otros no?
- 4. Emoji en MySQL y PHP: ¿por qué algunos símbolos sí otros no?
- 5. ¿Por qué mongodb parece guardar algunos objetos binarios y no otros?
- 6. ¿Por qué algunos instaladores necesitan reiniciar la computadora antes de ejecutar el programa?
- 7. cmake incluyendo h archivos de otros directorios
- 8. Django funciona user.is_authenticated algunos lugares, otros no
- 9. ¿Por qué MySQL está devolviendo algunos flotantes en notación científica, pero no en otros?
- 10. Creación de jQuery Plugin: ¿Por qué algunos hacen jQuery.pluginName y otros jQuery.fn.pluginName?
- 11. ¿Por qué no debería extender JFrame y otros componentes?
- 12. ¿Por qué los applets no necesitan un main()?
- 13. ¿Por qué las aplicaciones necesitan instalación?
- 14. ¿Por qué se necesitan importar el registro e importar logging.config?
- 15. scons: src y directorios incluyen
- 16. H.264 Filtra la pérdida de memoria con algunos decodificadores
- 17. ¿Por qué DateTime.ToString ("h") causa una excepción?
- 18. Habilitar ViewState para algunos controles y deshabilitar para otros/página
- 19. ¿Por qué algunos sitios web requieren "www"?
- 20. ¿Por qué los objetos de transferencia necesitan implementar Serializable?
- 21. ¿Qué juegos incluyen codificación en el juego?
- 22. ¿Por qué algunos lenguajes de programación son más rápidos que otros?
- 23. distutils Python no incluyen data_files
- 24. Algunos servicios se detienen automáticamente si no están siendo utilizados por otros servicios
- 25. ¿Por qué algunos sitios web importantes usan HTML no válido?
- 26. ¿Por qué algunos objetos no son accesibles desde diferentes subprocesos?
- 27. Por qué algunos tipos no tienen modificadores literales
- 28. ¿Por qué algunos sitios web no son compatibles con iPad?
- 29. ¿Por qué las transformaciones 2D necesitan matrices 3x3?
- 30. En psql, ¿por qué algunos comandos no tienen ningún efecto?
stdio también se pueden importar como '' # include –
mkb
@ Matt: Así que el nombre de importación es diferente del nombre de archivo. ¿Cómo se hace eso? – Casebash
@Casebach: usualmente hay dos archivos separados, 'cstdio' y' stdio.h', con 'cstdio' incluyendo' stdio.h' de una manera que pone todos sus símbolos en el espacio de nombres std. Pero la forma exacta en que lo hace depende de la implementación. –