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
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;
}
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++
Utilice el preprocesador C. Hacer algo como esto:
#ifdef __cplusplus
extern "C" {
#endif
// code goes here
#ifdef __cplusplus
}
#endif
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.
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++++. –
- 1. C# usando otros código
- 2. Usando/mezclando C en código C++?
- 3. analizando el código C usando python
- 4. Hello World Library usando autotools
- 5. Creando una biblioteca usando autotools de cmake
- 6. Usando el grupo de métodos C# ejecuta el código
- 7. llamar código de C++ no administrado desde C# usando pinvoke
- 8. Código Broken Mono C# usando System.Windows.Forms
- 9. Usando C++ DLL en el proyecto C#
- 10. Código Konami usando C# y ASP.net
- 11. Obtener variables de entorno usando el código C
- 12. C++: Usando typeid en el código de producción
- 13. ¿Cómo puedo refactorizar el código fuente de C++ usando emacs?
- 14. Usando código C++ nativo en C# - problema con std :: vector
- 15. ¿Cómo ver el ensamblaje detrás del código usando Visual C++?
- 16. Carga del componente ascx usando el código C#
- 17. Comprobación de Autotools para C++ 11
- 18. Abra el directorio usando C
- 19. usando scanf en C/C++
- 20. Algoritmo Rijndal usando C#
- 21. usando Poppler Qt4 C++
- 22. Usando ping en C#
- 23. C# usando la declaración
- 24. Usando NULL en C++?
- 25. Analizando CSV usando OleDb usando C#
- 26. Usando pthread en C++
- 27. C# WebRequest usando cookies
- 28. Usando LibCURL C++
- 29. Cómo construir un softphone (usando el protocolo SIP) usando C#
- 30. Usando C++ con Eclipse
Gracias! Muy apreciado. – drkatz
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. –
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? –