2010-08-26 11 views
10

Toda una pregunta para principiantes como es.¿Es cierto que todas las bibliotecas c se pueden usar en C++?

+0

¿Te refieres a los encabezados de biblioteca de C estándar o a cualquier biblioteca personalizada escrita en C? ¿Y de qué revisión de C estamos hablando? ¿También tienes una plataforma en mente? – Allbite

+2

@Allbite: Todo es irrelevante para la pregunta. –

+0

Siendo que las implementaciones varían en su soporte exacto para el estándar C++, y hay diferentes versiones de C y C++ (como en C99, ANSI, C++ 0x, etc.), algunas aclaraciones están en orden. Específicamente, ¿está preguntando sobre las funciones estándar de la biblioteca C, p. "strcpy", ¿o significa absolutamente cualquier C lib personalizado escrito por alguien? – Allbite

Respuesta

6

Sí. No hay ninguna razón por la que no pueda usar bibliotecas C en C++. Las cosas cambian si desea compilar C en un compilador de C++. El C ABI es totalmente compatible con C++, sin embargo, las cosas no son necesariamente tan ordenadas desde una perspectiva API. Ciertas adiciones de C como restrict no están en el estándar de C++, y deben tratarse con cuidado.

+0

Bate por 30 segundos con la misma respuesta :) –

+0

@Merlyn Morgan-Graham: Las escaleras son largas en tu torre :) –

+2

Un caso más extremo podría ser una función que toma un argumento tipo vla, por ejemplo 'int foo (int n, char x [] [n]); '- espero haber acertado. –

2

Si los encabezados están protegidos adecuadamente con extern "C" { ... }, entonces sí.

+0

Si no lo son, puedes hacer tus propios encabezados o puedes envolver los existentes. –

+0

No llamaría poner 'extern" C "{...}' en un encabezado para el código C-language "propiamente dicho", pero la respuesta de Stephen podría interpretarse como la colocación del 'extern" C "{...}' alrededor de las líneas '# include'. –

+2

@R ..: Por supuesto, uno protege el 'extern" C "' con '# si se define __cplusplus', o envuelve el include en lugar del propio encabezado. Pensé que era un hecho. –

0

Sí y no.

Los questionables son ...

  • literales del compund

  • número complejo nativo tipos de datos

  • "restringir" palabra clave

  • macros variadic

  • "long long int" tipo de datos

Algunas de esas características de C están incluidos en C++ 0x y algunos están disponibles como extensiones de la biblioteca en muchos compiladores más recientes para C "normal" ++.

Así que depende del nivel de C del que se está hablando, qué nivel de C++ estándar y qué plataforma de qué compilador, ya que las implementaciones del compilador siempre tienen soporte variado para los estándares y errores, por supuesto.

Y luego hay palabras clave usadas en C++ que no estaban definidas en C, y por lo tanto están disponibles para ser usadas como nombres de variables en C pero hacen que un compilador de C++ vomite. En C es perfectamente legal el uso de la frase siguiente, variables o nombres de funciones, pero, obviamente, hará C++ lanzar un berrinche ...

  • plantilla
  • nueva
  • clase

Oh y "goto" se comporta de manera diferente en C++ y C. En C++ "goto" no se puede utilizar para saltar sobre la inicialización de una variable, pero eso está bien para C. Lo mismo ocurre con las instrucciones de cambio. En C puede escribir una declaración de cambio o un conjunto de goto que no se compilará en C++.

¿Qué más? "strchr" funciona de manera diferente en C vs C++. En C devuelve un puntero char. En C++ devuelve un const puntero de char. Si usa esa salida de strchr de cierta manera en C, podría explotar en C++ debido a la const corrección de C++.

Las funciones en línea se manejan de manera diferente.En C tienen el alcance del archivo, pero en C++ tienen un enlace externo por defecto.

El código de C++ necesita prototipos de función definidos con extern "C" para llamar a una función C.

C++ mangles símbolos de nombres de funciones pero C no.

"En teoría no hay diferencia entre la teoría y la práctica En la práctica no es.." - Yogi Berra

+0

¿Por qué hay algunas de downvoting? ¿He cometido un error? – Allbite

0

Creo que mi ejemplo contribuido le mostrará por qué no siempre es posible:

#ifndef HEADER_H 
#define HEADER_H 
int class(int a, int b); 
int private(int a); 
#endif 

C perfectamente válida pero no se compilará en C++, incluso con un bloque "C" externo. Por lo que yo sé, la única manera de usar una biblioteca C así es crear otra biblioteca C que llame a esas funciones y luego usar esa biblioteca contenedora en su código C++.

Dicho esto, creo que tropezar con algo así en el "mundo real" es bastante raro.

+0

Para ser justos, nadie debería nombrar sus funciones de esa manera, pero esto demuestra que no todas las bibliotecas C son compatibles. – dreamlax

+1

Pero si lo compiló en una lib con un compilador c, podría usar la biblioteca en C++ - el nombre se encarga de resolverlo –

+0

@Martin - ¿cómo haría para usar esas funciones en C++? –

Cuestiones relacionadas