код доступа к внешней функции "C" - PullRequest
0 голосов
/ 11 января 2012

Скажем, у меня есть следующий код C ++:

int x;
some_class y;

extern "C" {
  void foo () {
    // do something with x
    // do something with y
  }
}

Должны ли x и / или y быть объявлены с extern "C"?

Ответы [ 4 ]

6 голосов
/ 11 января 2012

Нет.Нет ограничений на extern "C" функции, обращающиеся к функциям и переменным с помощью языка C ++.

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

1 голос
/ 11 января 2012

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

, вы можете свободно писать код, например:

    void bla() {cout<<"bla\n";}
extern "C" void sh() {bla();}

функция"sh" будет компилироваться с использованием компилятора c ++, поэтому он может свободно вызывать bla.extern "C" влияет только на имя функции.

1 голос
/ 11 января 2012

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

Редактировать: Чарльз Бэйли отмечает, что я, по-видимому, ошибался насчет связывания переменных одинаковым образом. Другими словами, если переменные используются внешним кодом C (которым они могут быть, поскольку они не являются статичными), вы должны поместить их в extern «C». Если вы используете их только внутри файла или только из внешнего кода C ++, вы можете хранить их там, где они есть.

0 голосов
/ 11 января 2012

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

* extern "C" имеет смысл, когда библиотека C предназначена для использования C иКод C ++.

В заключение, иметь класс внутри extern "C" не имеет смысла, x - это просто базовый тип, наличие внутри или снаружи не имеет значения.Обычный способ использовать эту функцию - поместить весь контент заголовка в такой блок.Наличие int объявления в заголовке не очень хорошая идея!Это создаст переменную для каждой единицы перевода и вызовет проблемы во время ссылки ... Не уверен, что вы намереваетесь делать с кодом, аналогичным тому, который вы опубликовали.

...