Buenos días. Me gustaría saber algunos conceptos sobre las librerías de c++ y c. Mi primera pregunta seria porqué se puede utilizar stdio.h en c++ ademas de iostream, y cual es mejor de utilizar a fin de cuentas, ademas otra pregunta sería que diferencia hay entre escribir "stdlib.h" y "cstdlib" todo eso en c++. Vengo de estudiar c y ahora estoy empezando con c++ y no tengo claro las diferencias.
-
Hola Raul, bienvenido. No olvides pasar por el [tour](http://es.stackoverflow.com/tour) para aprender más del funcionamiento del sitio. Y procura no utilizar expresiones como "la mejor" ya que todo es subjetivo o muy relacionado con la situacion y necesidades. Un saludo! – lois6b Feb 08 '17 at 12:35
2 Answers
¿Por qué se puede utilizar
stdio.h
en C++ ademas deiostream
?
El compilador.
En muchas ocasiones, el compilador usado para C++ y C es el mismo, tan sólo cambia la configuración del compilador para hacer compilaciones en uno u otro modo. Por este motivo no es raro que las librerías de ambos lenguajes estén disponibles mutuamente, es decir: también podrías incluir <iostream>
en un código C pero no te serviría de nada ya que C++ dispone de palabras clave diferentes (template
o namespace
no existen en C), algunas palabras clave no tienen el mismo significado (por ejemplo auto
1 o register
2) e incluso C++ ha deprecado elementos que en C siguen siendo válidos (como los dígrafos o trígrafos).
Costumbre.
Muchos programadores cuyo lenguaje principal ha sido durante años C trabajan también con C++. También, programadores de ciertas generaciones han sido educados con C en universiadaes y centros educativos antes que con C++ y para estos programadores suele ser más cómodo usar utilidades, sintaxis y constructos de C antes que aproximaciones de C++ incluso si están programando C++; no podrían hacer esto de no ser por la... ###Compatibilidad con C. C++ se basa en C y evoluciona a partir de éste. El comité de estándares de C++ hace muchos esfuerzos por mantener una compatibilidad con C (aunque esto, a cada año que pasa causa más controversia, tal vez dejen de preocuparse por esta compatibilidad en el futuro). Gracias a los esfuerzos realizados en esta compatibilidad, cualquier código de C es compilable en C++ usando las librerías adecuadas y con cambios mínimos (o ninguno).
¿Qué diferencia hay entre escribir
"stdlib.h"
y"cstdlib"
.
C++ adapta muchas de las librerías de C a su propia idiosincrasia, clasificando funciones en espacios de nombres o transformando algunas funciones en plantillas, cuando una librería de C ha sido adaptada a C++ su archivo recibe una c
como prefijo y se le elimina la extensión, aquí tienes un listado de archivos de cabecera C y su cabecera adaptada en C++:
C++ | C |
---|---|
cassert | assert.h |
cctype | ctype.h |
cerrno | errno.h |
cfloat | float.h |
ciso646 | iso646.h |
climits | limits.h |
clocale | locale.h |
cmath | math.h |
csetjmp | setjmp.h |
csignal | signal.h |
cstdarg | stdarg.h |
cstdbool | stdbool.h |
cstddef | stddef.h |
cstdint | stdint.h |
cstdio | stdio.h |
cstdlib | stdlib.h |
cstring | string.h |
ctime | time.h |
cuchar | uchar.h |
cwchar | wchar.h |
cwctype | wctype.h |
¿Cuál es mejor de utilizar?
Utiliza la colección de cabeceras específica de cada lenguaje, es decir: en C usa stdio.h
y si necesitas algo de esa librería en C++ usa cstdio
.
1En C auto
es un especificador de almacenamiento (la misma categoría que static
, por ejemplo) mientras que en C++ se usa para la deducción estática de tipos.
2En C register
se usa para indicar al compilador que la variable cualificada con esta palabra clave será muy usada y el programador recomienda que sea almacenada en un registro de procesador, en C++ esta palabra clave está deprecada (a partir de C++17).
- 44,474
- 6
- 44
- 82
-
-
@Raul la tabla es una conversión muy sencilla... a la librería 'x.h' le quitas la extensión y le añades como prefijo una 'c'. Así `x.h cx` – eferion Feb 08 '17 at 10:35
-
-
Lo se, solo quería remarcárselo porque con su comentario me ha dado la impresión de que no ha interiorizado esa parte. – eferion Feb 08 '17 at 10:44
¿Porqué se puede utilizar
stdio.h
en c++ ademas deiostream
?
Al principio, lo que hoy conocemos como C++ no eran sino un compendio de macros pensadas para que C se comportase como un lenguaje orientado a objetos. Con el tiempo se hizo necesario crear un lenguaje propio y ahí nació C++.
Debido a esa historia común, las librerías de C han sido siempre compartidas por C++ y, por compatibilidad, lo seguirán siendo.
En el caso de cstdio
, esta librería existe únicamente para mantener la coherencia con la librería estándar propia de C++, donde ninguna librería incluye la extensión .h
.
En el caso de iostream
tenemos una librería propia de C++ que puede aprovechar todas las bondades de dicho lenguaje. Así pone a nuestra disposición una serie de facilidades de entrada/salida con multitud de utilidades que además podemos ampliar y configurar a nuestro antojo (Así, por ejemplo, podemos preparar nuestras clases para que puedan imprimirse por pantalla usando el operador de inserción std::cout << miClase
, cosa que en C es impensable).
Por otro lado, el hecho de que existan stdio.h
e iostream
no es del todo malo:
- La gente que viene de C puede aprovecharse de una curva de aprendizaje más suave ya que puede reaprovechar buena parte del conocimiento que ya posee.
- Hay operaciones que pueden resultar más sencillas de implementar con las librerías de C
- Disponer de las librerías de C aumenta la compatibilidad entre ambos lenguajes.
¿que diferencia hay entre escribir
stdlib.h
ycstdlib
?
Absolutamente ninguna. La diferencia la encuentras al compilar en C o compilar en C++. Las librerías disponibles en C++ (tanto stdio.h
como cstdio
) añaden una versión de las funciones bajo el espacio de nombres std
, cosa que por motivos obvios no se puede hacer en C.
¿Cual es mejor de utilizar?
Dado que no hay diferencias, siéntete libre de utilizar la versión que más te guste.
- 49,291
- 5
- 30
- 72
-
-
1No es del todo cierto que no existan diferencias entre `xxxx.h` y `cxxxx`, por ejemplo en `math.h` disponemos de varias versiones de `ceil` (`ceil`, `ceilf` y `ceill`) mientras que en `cmath` cuatro sobrecargas (además de estar en el espacio de nombres `std`). – PaperBirdMaster Feb 08 '17 at 11:31
-
@PaperBirdMaster No olvidemos que math es una librería "_diferente_" que al menos antes había que enlazarla de forma explícita para poder usar sus funciones. En lo referente al espacio de nombres, ambas deberían crear las funciones en `std` y en el espacio de nombres global – eferion Feb 08 '17 at 11:34
-
Sea como sea, en ese ejemplo no se puede afirmar que no haya "absolutamente ninguna diferencia" entre una librería `xxx.h` y `cxxx`, además C no dispone de espacios de nombres, sólo con eso ya es bastante diferente. Pero sin usar el *controvertido* ejemplo de math, en caso de stdio también tenemos **notables diferencias** para la família `printf` entre [`stdio.h`](http://en.cppreference.com/w/c/io/fprintf) y [`cstdio`](http://en.cppreference.com/w/cpp/io/c/fprintf). – PaperBirdMaster Feb 08 '17 at 11:42
-
@PaperBirdMaster Yo únicamente estoy hablando de trabajar en C++... Al trabajar con C no tiene ningún sentido hablar de las librerías de C++. – eferion Feb 08 '17 at 11:43
-
Tiene sentido hablar de las diferencias entre ambas en el momento en que parte de las dudas del usuario es precisamente si existen diferencias :) incluso trabajando exclusivamente en C++ incluyendo `stdio.h` tendrás acceso a `printf_s` pero no existirá dicha función incluyendo `cstdio` – PaperBirdMaster Feb 08 '17 at 11:46
-
@PaperBirdMaster De hecho mira, para que te quedes más tranquilo... sacado de la cabecera `cstdio` de mi compilador, línea 42: `#include
`. Así pues lo que dices de que `printf_s` no va a estar disponible en `cstdio`.... – eferion Feb 08 '17 at 11:46 -
No me aporta ni tranquilidad ni intranquilidad saber ese dato. Simplemente quería remarcar que `xxx.h` y `cxxx` no son lo mismo, ni siquiera si la versión C++ incluye la versión C (el hecho de que una incluya a otra ya es prueba de que no son lo mismo). Puedo decir que `cstdio` puede no tener disponible `printf_s` porque no hay garantías de que así vaya a ser en todos los casos. – PaperBirdMaster Feb 08 '17 at 11:49
-
@PaperBirdMaster [enlace1](http://stackoverflow.com/questions/10694255/c-cmath-vs-math-h-and-similar-c-prefixed-vs-h-extension-headers) [enlace2](http://stackoverflow.com/questions/2247094/whats-the-difference-between-c-header-files-h-and-c-header-files-hpp). No veo que demasiada gente critique las diferencias que comentas... que una versión tiene 3 funciones y la otra 7... eso es porque por diferencias entre lenguajes determinadas conversiones no son válidas (eso sí en la cabecera .h de un compilador de C++ no vas a encontrar **JAMAS** la implementación de la cabecera del compilador de C) – eferion Feb 08 '17 at 11:53
-
Entonces me estás dando la razón: NO se puede decir que "no hay absolutamente ninguna diferencia" entre las cabeceras de C y de C++... si tenemos diferentes funciones, diferentes implementaciones y la existenca o ausencia de espacios de nombres... por mucho que la gente no critique dichas diferencias los archivos no son iguales, de serlo: serían intercambiables y... evidentemente no lo son. – PaperBirdMaster Feb 08 '17 at 11:57
-
Alguien me podria explicar de una manera sencilla para que uso "using namespace std", ya que en c nunca lo vi, ademas intentando ver que era por internet, vi que lo desaconsejan por posibles errores – Raul Feb 08 '17 at 11:59
-
@Raul si no te importa crea una pregunta nueva o mira si hay preguntas similares – eferion Feb 08 '17 at 12:05
-
@PaperBirdMaster no te ofusques la pregunta va enfocada desde C++ ya que si no estás comparando churras con merinas. Como bien has dicho otras veces C y C++ son cosas distintas. Preguntarse por las diferencias entre x.h y cx solo tiene sentido si hablas sobre C++ y en este caso **no hay diferencias**. – eferion Feb 08 '17 at 12:07
-
@eferion ¡pensé que habíamos quedado en que sí que las hay! Son archivos distintos, con contenido distinto y funciones distintas (incluso cuando C++ incluye C, lo hace para añadir contenido) así que diferencias, haberlas: haylas. – PaperBirdMaster Feb 08 '17 at 13:08
-
@Raul [esta pregunta](http://es.stackoverflow.com/questions/460/por-qu%c3%a9-el-usar-using-namespace-std-se-considera-mala-pr%c3%a1ctica) podría serte de ayuda para tu nueva duda. – PaperBirdMaster Feb 08 '17 at 13:09
-
@PaperBirdMaster Entonces ve a los enlaces que te he puesto de StackOverflow en ingles y dedícate a poner negativos y comentarios porque ellos también respaldan lo que digo... – eferion Feb 08 '17 at 13:09
-
@eferion Vale, aunque no es mi prioridad... no entiendo cómo se puede andar diciendo que dos cosas distintas son iguales. Acabo de mirar los enlaces que me compartiste, y ninguno de los dos afirma que `cxxx` y `xxx.h` sean lo mismo. – PaperBirdMaster Feb 08 '17 at 13:13