template generic example c++ templates extern

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:

  1. ¿Cómo funciona extern "C++" ?
  2. ¿Es este portátil entre GCC, y Clang?
  3. ¿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?


  1. 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).
  2. Sí, debería ser portátil.
  3. 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 ++.