Каково влияние extern "C" в C ++? - PullRequest
1420 голосов
/ 25 июня 2009

Что именно делает extern "C" в коде C ++?

Например:

extern "C" {
   void foo();
}

Ответы [ 13 ]

5 голосов
/ 17 ноября 2015

extern "C" - это спецификация связи, которая используется для вызова функций C в исходных файлах Cpp . Мы можем вызывать функции C, записывать переменные и включать заголовки . Функция объявлена ​​во внешнем объекте и определена снаружи. Синтаксис

Тип 1:

extern "language" function-prototype

Тип 2:

extern "language"
{
     function-prototype
};

например:

#include<iostream>
using namespace std;

extern "C"
{
     #include<stdio.h>    // Include C Header
     int n;               // Declare a Variable
     void func(int,int);  // Declare a function (function prototype)
}

int main()
{
    func(int a, int b);   // Calling function . . .
    return 0;
}

// Function definition . . .
void func(int m, int n)
{
    //
    //
}
2 голосов
/ 24 июля 2018

Этот ответ для нетерпеливых / у которых есть крайние сроки, только часть / простое объяснение ниже:

  • в C ++ вы можете иметь одно и то же имя в классе через перегрузку (например, поскольку все они с одинаковым именем не могут быть экспортированы как есть из dll и т. Д.), Решение этих проблем заключается в том, что они конвертируются в разные строки (называемые символами), символы учитывают имя функции, а также аргументы, поэтому каждая из этих функций, даже с одинаковым именем, может быть однозначно идентифицирована (также называется, искажение имени)
  • в C, у вас нет перегрузки, имя функции уникально (поэтому отдельная строка для уникального определения имени функции не требуется, поэтому символом является само имя функции)

So
в C ++, с изменением названия уникально идентифицирует каждую функцию
в C даже без искажения имени однозначно идентифицирует каждую функцию

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

Прочитайте другие ответы, для более подробных / более правильных ответов.

1 голос
/ 06 июля 2017

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

Так что нам нужно использовать extern "C", чтобы отключить искажение имени в C ++.

...