Я часто сталкиваюсь с заголовочными файлами C, которые содержат extern "C"
охранники,
но не содержат никаких реальных функций. Например:
/* 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 */
я знаю это extern "C"
предотвращает искажение имен в функциях, но предотвращает ли это и другие проблемы, связанные с объявлениями переменных и типов?
Является ли использование extern "C"
в приведенном выше примере бессмысленно с точки зрения результирующей совместимости?
Некоторые компиляторы (это редко) реализуют искажение имен для переменных, а не только для функций. В таком случае, extern "C"
может понадобиться
Некоторые компиляторы (это также редко, но требуется стандартом) реализуют языковые связи для функций типы, не только имена, так typedef void f();
а также extern "C" { typedef void f(); }
объявлять разные типы.
Также некоторые сопровождающие не заметят отсутствие extern "C"
если они изменяют заголовок, чтобы добавить функции.
Я рекомендую вам просто включить его.
Нет, extern C
здесь не требуется, но может быть удобно иметь его во всех заголовках, чтобы не забыть его при добавлении новой функции.