generic - template<> c++
¿Cómo funciona “extern C++”? (2)
Salté a winnt.h
y descubrí el siguiente código:
extern "C++" // templates cannot be declared to have ''C'' linkage
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];
Me gustaría hacer preguntas de la siguiente manera:
- ¿Cómo funciona
extern "C++"
? - ¿Es este portátil entre GCC, y Clang?
- ¿Se pueden exportar todas las plantillas con esta sintaxis?
Con la pregunta 3, quiero decir, ¿puedo separar la eliminación de plantillas y la definición de las plantillas y luego generar un enlace dinámico para la plantilla sin dar la implementación usando este truco?
- Funciona forzando al compilador a usar el enlace C ++ cuando el código circundante usa el enlace C de forma predeterminada (por ejemplo, incluye winnt.h en un programa C).
- Sí, debería ser portátil.
- Sí pueden. No hay mucho uso para "extern" C ++ "" en los programas de C ++ porque el enlace es "C ++" de todos modos. Tiene sentido usar "extern" C ++ "" solo si existe una buena posibilidad de que su código C ++ se incluya en un código C.
Bueno, extern "C++"
no funcionará en C, por supuesto (aunque algunos compiladores podrían admitirlo como una extensión). Así que solo tiene sentido usarlo en C ++.
Esto se debe a que en el caso de múltiples especificadores de enlace externos anidados, el más interno tiene efecto. Por lo tanto, si tiene un archivo de encabezado rodeado por una extern "C"
, puede usar una extern "C++"
para salir de ella temporalmente y declarar algo con el enlace de C ++.
Tiene más sentido cuando desea proporcionar una interfaz en general C para una biblioteca de C ++, pero también desea proporcionar bits de ayuda de C ++ para las personas que realmente la usan en C ++. Así que pondría #ifdef __cplusplus / extern "C" { / #endif
alrededor del encabezado en su totalidad, y luego, si es así, ingrese esos bits con extern "C++"
para revertir al enlace C ++.