Вы используете extern "C"
для предотвращения искажения имен в заголовочных файлах и ваших объектных файлах C ++ для библиотек или объектов, которые уже были скомпилированы без искажения.
Например, скажем, у вас есть библиотека widget
, которая была скомпилирована с помощью компилятора C, так что ее опубликованный интерфейс не искажен.
Если вы включите заголовочный файл как есть в свой код, он будет предполагать, что имена являются искаженными, а эти искаженные версии - это то, что вы скажете компоновщику искать.
Однако, поскольку вы будете запрашивать что-то вроде function@intarray_float_charptr
, а библиотека widget
будет публиковать только function
, у вас возникнут проблемы.
Однако, если вы включите его с:
extern "C" {
#include "widget.h"
}
ваш компилятор будет знать, что он должен попытаться использовать function
, не искаженную версию.
Вот почему в заголовочных файлах для C, предназначенных для включения в программы C _ или C ++, вы увидите такие вещи, как:
#ifdef __cplusplus
extern "C" {
#endif
// Everything here works for both C and C++ compilers.
#ifdef __cplusplus
}
#endif
Если вы используете компилятор C для включения этого, строки #ifdef
приведут к исчезновению содержимого extern "C"
. Для компилятора C ++ (где определено __cplusplus
) все будет не повреждено.