Extern используется дважды в C ++ - PullRequest
2 голосов
/ 27 апреля 2020

Мне очень любопытно, что происходит во время линковки, и во время моих исследований в этой области я использовал этот код

#ifdef __cplusplus
extern “C” { 
#endif

extern double reciprocal (int i);

#ifdef __cplusplus
}
#endif

Код был в каком-то заголовочном файле, который был включен. c и. cpp исходные файлы одной программы. Это объявление функции, которая затем определяется в. cpp файле. Почему это работает? Я имею в виду, что во время компиляции файла. cpp это превратится в

extern "C" {
    extern double reciprocal (int i);
}

Внешний внешний вид делает функцию видимой в глобальной области видимости и преобразует стиль имен в C ++ в C один. Но есть и внутренний экстерьер. Это нормально, что функция продлевается в два раза?

1 Ответ

4 голосов
/ 27 апреля 2020

Язык c ++ является аллергией c на добавление новых ключевых слов, поэтому некоторые из них используются для обозначения разных вещей. extern является одним из этих повторно используемых ключевых слов. Имеет 3 возможных значения :

  1. внешняя связь - переменная или функция определяется где-то еще
  2. языковая связь - переменная или функция определяется как " external "language
  3. явное объявление создания шаблона

В вашем случае вы используете 1 и 2. extern "C" объявляет, что код имеет "C" вместо значения по умолчанию "C++" связь. Это также подразумевает внешнюю связь, поэтому в чистом коде C ++ вы можете просто написать:

extern "C" {
    double reciprocal (int i);
}

и reciprocal будут автоматически помечены extern. Добавление дополнительной extern не имеет никакого эффекта и требуется для версии C, в которой нет оболочки extern "C".

Обратите внимание, что если вы используете версию extern "C" с одним объявлением, тогда используйте второй extern недействителен:

extern "C" extern double reciprocal (int i);

Поскольку второй extern не требуется, правильное объявление:

extern "C" double reciprocal (int i);
...