2009-02-08 15 views
5

Escribo una (mi primera) clase C++ encima de un código escrito en C, pero solo puedo obtener el C++ para compilar declarando las funciones C en un bloque externo. Mi proyecto usa autotools; ¿hay alguna manera de automatizar este proceso, así que no tengo que mantener dos archivos de encabezado?Usando el código C de C++ usando autotools

Respuesta

3

Sí crear archivos de cabecera de envoltura que incluyen los archivos de cabecera C al igual que ...

//Wrapper.h 
#ifdef __cplusplus 
extern "C" 
{ 

    #include "Actual.h" 
} 
#else 
    #include "Actual.h" 
#endif 


//Use.cpp 
#include "Wrapper.h" 

int main() 
{ 
    return 0; 
} 

//Use.c 
#include "Wrapper.h" 
/*or #include "Actual.h" */ 

int main() 
{ 
    return 0; 
} 
+0

Gracias! Muy apreciado. – drkatz

+0

Si bien esto ciertamente funciona, creo que la respuesta a una clasificación mucho más alta a continuación es mejor: utilice el preprocesador en los archivos de encabezado reales para declarar las funciones 'extern" C "'. De esta forma, puede incluir el encabezado de la misma manera en C y C++, y no tener que preocuparse por un encabezado "envoltorio" adicional. –

+0

Es cierto, pero ¿y si el encabezado real no se puede modificar? ¿Qué pasa si se obtuvo de un tercero/otro proyecto cuyas fuentes no están siendo mantenidas por usted? –

15

utilizar un bloque extern en el interior de un #ifdef códigos C Archivos de encabezado

comienzo de los archivos de cabecera

#ifdef __cplusplus 
extern "C" { 
#endif 

... y al final de los archivos de cabecera

#ifdef __cplusplus 
} 
#endif 

De esta forma funcionará para ser incluido en las fuentes C y C++

1

Utilice el preprocesador C. Hacer algo como esto:

#ifdef __cplusplus 
extern "C" { 
#endif 
// code goes here 

#ifdef __cplusplus 
} 
#endif 
1

Tenemos una macro en un archivo de cabecera:

#ifdef __cplusplus 
    #define _crtn "C" 
#else 
    #define _crtn 
#endif 

Luego, en los archivos de cabecera, podemos usar _crtn:

#include "croutine.h" 

extern _crtn void MyFunction(...); 

El gotcha es asegúrese de incluir el archivo de encabezado que contiene el prototipo de MyFunction dentro del archivo que contiene la implementación de MyFunction para que se compile con una vinculación "C".

Esto es lo mismo que la respuesta de @epatel, pero solo requiere el feo #ifdef en un archivo de encabezado.

+0

Hecho poco conocido: puede declarar funciones como "C++" externo, aunque es inútil ya que es el predeterminado al compilar con C++, y los compiladores de C no pueden compilar C++. Pero puede ser útil en el futuro para el hipotético lenguaje C++++. –