Какое влияние оказывает extern & ldquo; C & rdquo; в С ++?

Если вы не хотели использовать регулярное выражение ...

var chunks = [];

for (var i = 0, charsLength = str.length; i < charsLength; i += 3) {
    chunks.push(str.substring(i, i + 3));
}

jsFiddle .

... в противном случае решение регулярного выражения довольно хорошо:)

1436
задан Ciro Santilli 新疆改造中心996ICU六四事件 15 March 2018 в 08:35
поделиться

4 ответа

extern "C" делает имя функции в C ++ связью с 'C' (компилятор не изменяет имя), чтобы клиентский код C мог связываться с вашей функцией (т. Е. Использовать) с помощью Заголовочный файл, совместимый с 'C', который содержит только объявление вашей функции. Определение вашей функции содержится в двоичном формате (который был скомпилирован вашим компилятором C ++), который затем связывается компоновщиком клиента C с использованием имени C.

Поскольку C ++ имеет перегрузку имен функций, а C нет , компилятор C ++ не может просто использовать имя функции в качестве уникального идентификатора для ссылки, поэтому он искажает имя, добавляя информацию об аргументах. Компилятору AC не нужно искажать имя, поскольку вы не можете перегрузить имена функций в C. Когда вы заявляете, что функция имеет внешнюю связь «C» в C ++, Только имена функций и имена переменных с внешней связью имеют языковую связь

  • два типа функций с разными языковыми связями являются разными типами, даже если в остальном идентичные
  • спецификации связи вложены, внутренняя определяет окончательную связь
  • extern "C" игнорируется для членов класса
  • максимум одна функция с определенным именем может иметь связь "C" (независимо от пространства имен)
  • extern "C" заставляет функцию иметь внешнюю связь (не может сделать ее статической) См. Комментарий Ричарда: 'static' внутри 'extern "C"' допустимо; объявленный таким образом объект имеет внутреннюю связь, и поэтому не имеет языковой привязки
  • Связь из C ++ с объектами, определенными на других языках, и с объектами, определенными в C ++ из других языков, определяется реализацией и зависит от языка. Такое связывание может быть достигнуто только там, где стратегии размещения объектов двух языковых реализаций достаточно похожи
  • 1457
    ответ дан 22 November 2019 в 20:15
    поделиться

    Он сообщает компилятору C ++ искать имена этих функций в C-стиль при компоновке, потому что имена функций, скомпилированных на C и C ++, на этапе компоновки различаются.

    19
    ответ дан 22 November 2019 в 20:15
    поделиться

    Он изменяет привязку функции таким образом, что функция вызывается из C. На практике это означает, что имя функции не искажено .

    27
    ответ дан 22 November 2019 в 20:15
    поделиться

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

    В языке C имя символа совпадает с именем функции. Это возможно, потому что в C две нестатические функции не могут иметь одно и то же имя.

    Поскольку C ++ допускает перегрузку и имеет много функций, которых нет в C - например, классы, функции-члены, спецификации исключений - невозможно просто использовать имя функции как имя символа. Чтобы решить эту проблему, C ++ использует так называемое искажение имен, доступ к нему осуществляется с использованием имени символа в качестве имени функции.

    Это удобно при использовании dlsym () и dlopen () для вызова таких функций.

    198
    ответ дан 22 November 2019 в 20:15
    поделиться