c++ - ¿Hay alguna razón para usar extern "C" en los encabezados sin métodos?
header-files extern-c (2)
Con frecuencia me encuentro con archivos de cabecera C que contienen guardias extern "C"
,
pero no contienen ninguna función real. Por ejemplo:
/* b_ptrdiff.h - base type ptrdiff_t definition header */
#ifndef __INCb_ptrdiff_th
#define __INCb_ptrdiff_th
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
typedef long ptrdiff_t;
#endif /* _PTRDIFF_T */
#ifdef __cplusplus
}
#endif
#endif /* __INCb_ptrdiff_th */
Sé que la extern "C"
previene la manipulación de nombres en las funciones, pero ¿también previene contra otros problemas de interfaz en declaraciones de tipo y variable?
¿El uso de extern "C"
en el ejemplo anterior no tiene sentido en términos de compatibilidad resultante?
Algunos compiladores (es raro) también implementan la manipulación de nombres para variables, no solo para funciones. En ese caso, puede necesitarse una extern "C"
.
Algunos compiladores (también es raro, pero requerido por el estándar) implementan enlaces de lenguaje para tipos de funciones, no solo nombres, por lo que typedef void f();
y extern "C" { typedef void f(); }
extern "C" { typedef void f(); }
declarar diferentes tipos.
Además, algunos mantenedores no notarán la ausencia de una extern "C"
si modifican el encabezado para agregar funciones.
Te recomiendo que simplemente lo incluyas.
No, el extern C
no es necesario allí, pero puede ser conveniente tenerlo en todos los encabezados para asegurarse de que no se olvida cuando se agrega una nueva función.