lista - ¿Se pueden usar las funciones de la biblioteca estándar de C en C++?
lista de librerias en lenguaje c (3)
En este momento me estoy familiarizando con C y la biblioteca estándar de C y me pregunto si mi conocimiento en esta área será útil cuando vuelva a trabajar con C ++ en un momento posterior.
Por lo tanto, me gustaría saber si puedo usar las funciones proporcionadas por la biblioteca estándar C en una configuración C ++, y también si y por qué tendría sentido hacerlo realmente.
Sí. Puede usar las funciones estándar de la biblioteca c en los ejemplos de C ++.
stdio.h => cstdio (printf/scanf)
math.h => cmath (sqrt)
Solo citaré un párrafo de la norma ISO / IEC N3690 (estándar c ++).
17.2 La biblioteca estándar de C
1 La biblioteca estándar de C ++ también pone a disposición las instalaciones de la biblioteca estándar C, ajustadas adecuadamente para garantizar la seguridad del tipo estático.
Así que simplemente sí!
Sí, C ++ se diseñó originalmente para que cualquier biblioteca C se pueda usar fácilmente en C ++. Por supuesto, esto es un poco menos cierto (en particular, si una biblioteca de C usa alguna palabra clave de C ++ como try
o dynamic_cast
, no funcionará; también, si una callback codificada en C ++ que se pasa a una biblioteca de C es una excepción, es probable que tengas un gran lío).
La práctica estándar para usar un archivo de encabezado de C en C ++ es
extern "C" {
#include <some_c_header_file.h>
};
y la mayoría de los archivos de encabezado C existentes están diseñados para cooperar con C ++ al contener cosas como
#ifdef __cplusplus
extern "C" {
#endif
//// most of the header material goes here, C style
#ifdef __cplusplus
}; // end extern "C"
#endif
En la práctica, muchos encabezados estándar C tienen encabezados C ++ equivalentes que envuelven cosas como las anteriores (y también en el namespace std
de namespace std
). Por ejemplo, C <stdio.h>
es C ++ <cstdio>
-pero a menudo usted prefiere las transmisiones C ++ genuinas ( <iostream>
), sin embargo, las rutinas similares a printf
suelen ser más amigables con la localization combinadas con gettext(3) .
Sin embargo, C y C ++ son lenguajes muy diferentes. Debe codificar en C ++ 11 idiomático (utilizando containers estándar de C ++, auto
, closures , RAII , punteros inteligentes , regla de cinco , SFINAE , exceptions , funciones anónimas , ...)
Algunas funciones estándar de C no son muy útiles en C ++ idiomático. Por ejemplo, es poco probable que use directamente malloc
en C ++ genuino (al menos prefiera el new
que todavía es de muy bajo nivel y no más en el espíritu de C ++), es más probable que use mucho los contenedores y los punteros inteligentes sin tener que tratar manualmente con el montón. asignación). Pero POSIX funciones POSIX (especialmente syscalls(2) ....) son bastante útiles en C ++. Es probable que longjmp
sea incompatible con las excepciones de C ++.
Por cierto, C ++ ha evolucionado mucho en este siglo. No aprenda C ++ 98 pero al menos C++11 (hay enormes diferencias entre ellos) y tal vez C++14 . Utilice un compilador reciente ( GCC o Clang/LLVM ); en diciembre de 2015, eso significa GCC 5 al menos o Clang / LLVM 3.7 al menos. No olvide habilitar todas las advertencias y la información de depuración en el compilador (por ejemplo, g++ -Wall -Wextra -g -std=c++11
)
C ++ (que significa al menos C ++ 11) es un lenguaje de programación difícil , considerablemente más complejo de lo que C es. Necesitará semanas de lectura para aprender un poco, y un buen estilo y disciplina de codificación es esencial (puede escribir fácilmente código muy malo en C ++). Comience con la programación: Principios y práctica utilizando C ++
Creo que si solo conoces C, leer SICP (y estudiar un poco de Scheme) antes de aprender C ++ vale la pena.
La noción de comportamiento indefinido es muy importante, tanto en C como probablemente en C ++. Es absolutamente necesario que lo entiendas (mira el blog de C.Lattner) y lo avoid .
También aprenderá mucho estudiando (y quizás contribuyendo a) algún software libre existente y su código fuente. Por lo tanto, recomiendo usar Linux.