Есть ли причина использовать extern & quot; C & quot; на заголовки без методов?

Я часто сталкиваюсь с заголовочными файлами 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" в приведенном выше примере бессмысленно с точки зрения результирующей совместимости?

18

Решение

Некоторые компиляторы (это редко) реализуют искажение имен для переменных, а не только для функций. В таком случае, extern "C" может понадобиться

Некоторые компиляторы (это также редко, но требуется стандартом) реализуют языковые связи для функций типы, не только имена, так typedef void f(); а также extern "C" { typedef void f(); } объявлять разные типы.

Также некоторые сопровождающие не заметят отсутствие extern "C" если они изменяют заголовок, чтобы добавить функции.

Я рекомендую вам просто включить его.

23

Другие решения

Нет, extern C здесь не требуется, но может быть удобно иметь его во всех заголовках, чтобы не забыть его при добавлении новой функции.

9

По вопросам рекламы [email protected]