Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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