Como sabemos que podemos usar las funciones c directamente en C++, cuando es necesario extern "C"
?¿Cuándo es necesario "extern C" en C++ en Windows?
Respuesta
Es necesario cuando se debe llamar a una función C++
por el código C
en lugar del código C++
.
Básicamente, cuando desee que su biblioteca C++
sea compatible con versiones anteriores.
Si su función está implementada en un archivo .c, los archivos .cpp necesitarán la referencia externa "C", o bien harían referencia a un nombre de función de estilo C++ y el enlace fallaría.
También es útil para exportar funciones desde archivos DLL para que se exporten con un nombre no destruido.
Esta respuesta es correcta pero incompleta, como la respuesta de @Randolpho, que también es correcta pero incompleta. La respuesta completa sería la suma de ambos. –
Debido a que las firmas de funciones generadas por los compiladores C y C++ difieren - esto configura la convención C para la función C incluso cuando se usa C++.
Como sabe, la función de sobrecarga de función de C++, que define la misma función o método muchas veces con diferentes parámetros. Para ello, el compilador tiene que añadir un poco de parte de los símbolos para cada uno ... por ejemplo, el compilador va a cambiar el nombre de la función foo en la siguiente declaración de
void foo(int f,char c);
a
[email protected]&c
Desafortunadamente, C no es compatible con esto. Todos los nombres de funciones permanecen iguales después de compilarlo. Entonces, para llamar a una función C++ desde c, debe saber el nombre exacto después de la modificación y creo que es difícil y diferente de un compilador a otro.
Para evitar esto y poder llamada C++ c función de parada y el compilador de cambio de los nombres que tienen que utilizar esta palabra clave como
extern "C" {
void foo(int f,char c);
}
eso es todo !!!
+1 Para explicar claramente las razones, pero esto también ocurre en la dirección opuesta: si tiene una función en C en una biblioteca e incluye el encabezado sin el calificador 'extern 'C" ', el compilador de C++ destruirá el símbolo. Luego, en la etapa de enlace, intentará localizar el símbolo mutilado y no lo hará, ya que el compilador c no modificó el nombre al compilar el código C. –
Existen dos usos bastante diferentes para extern "C"
. Una es definir una función en C++ que debería llamar a desde C. Es decir, está escribiendo código en C++, pero necesita interconectarse con el código C. En este caso, definir la función como extern "C"
:
extern "C" {
int c_callable_func1() {}
int c_callable_func2() {}
}
Al hacer esto, la interfaz de esas funciones debe seguir más o menos las mismas reglas que lo harían en C, así (por ejemplo, se puede' sobrecargar las funciones o usar valores predeterminados para cualquier parámetro).
La otra situación (considerablemente más común) es que tiene un código escrito en C al que desea llamar desde C++. En este caso, las definiciones de la función permanecen exactamente como antes, pero las funciones deben declararse/prototipadas como extern "C"
.En un caso típico, que desea utilizar una única cabecera que puede ser #include
d en cualquier C o archivo C++, por lo que la estructura es como la siguiente:
// myheader.h
#ifndef MY_HEADER_H_INCLUDED_
#define MY_HEADER_H_INCLUDED_
#ifdef __cplusplus
extern "C" {
#endif
int func1(void);
void func2(int);
#ifdef __cplusplus
}
#endif
#endif
Así, un compilador de C++ ver las declaraciones de función (y typedef
s, etc.) rodeado por un bloque extern "C"
, mientras que un compilador C verá prototipos, no rodeado por algo que no reconoce.
En el primer caso (funciones C++ llamables desde C), normalmente estructurará el encabezado aproximadamente de la misma manera, por lo que también puede llamar esas funciones desde C++ si es necesario (pero en la interfaz, aún pierde todo características de C++ como la sobrecarga de funciones).
- 1. Cuándo usar extern "C"?
- 2. Cuándo usar extern "C" en C++?
- 3. Cuándo usar extern "C" en palabras simples?
- 4. Windows y C++: extern & __declspec (dllimport)
- 5. enumeración extern en C++
- 6. ¿Cuándo debemos usar la palabra clave extern alias en C#?
- 7. ¿Extern "C" tiene algún efecto en C?
- 8. Envolver objeto de C++ en extern "C"
- 9. ¿Cómo funciona extern en C++?
- 10. static vs extern "C"/"C++"
- 11. ¿Cuándo es necesario deshacerse?
- 12. extern en una función estática en C++
- 13. ¿Cuándo es necesario el "var" en js?
- 14. Uso de extern en el objetivo C
- 15. Application.DoEvents, ¿cuándo es necesario y cuándo no?
- 16. ¿Es necesario escabullirse en cadenas en el Registro de Windows?
- 17. ¿Cuándo es (esto! = Esto) en C++?
- 18. ¿Cuándo es "inline" ineficaz? (en C)
- 19. ¿C++ soportará 0x __stdcall o extern captura "C" -nada lambdas?
- 20. C# new [delegate] no es necesario?
- 21. C - ¿Por qué strcpy() es necesario?
- 22. ¿Es 'volátil' necesario en este código C++ multihilo?
- 23. C - Si se usa Realloc, ¿es necesario?
- 24. Cuándo usar AtomicReference (Java)? ¿Es realmente necesario?
- 25. sun-jaxws.xml - ¿Cuándo es necesario y cuándo no?
- 26. ¿Cuándo se ordena un punto y coma} en c/C++?
- 27. Pregunta de conversión C++ a Java sobre extern "C"
- 28. Propósito del modificador extern del constructor C#
- 29. ¿Cuándo se necesita malloc en C?
- 30. ¿Cuándo es necesario ejecutar invalidate() en una vista?
No, no, no ... ugh! Si un proyecto es 'C', no le agregue' C++ ': conviértalo en' C++ 'y, si es necesario, agregue' C' al proyecto 'C++'. * O (incluso mejor en mi humilde opinión) mantenlo en 'C' y evita' C++ 'por completo. * – pmg
Esta respuesta es correcta pero incompleta, como la respuesta de @Graham Perks, que también es correcta pero incompleta. La respuesta completa sería la suma de ambos. –
@pmg: puede que no sea el propietario del Proyecto C o no pueda cambiar la interfaz que desean, incluso si su biblioteca está desarrollada en C++ –