Зачем вам использовать "extern" С++ ""?

В этой статье ключевое слово extern может сопровождаться "C" или "С++". Зачем вам использовать "extern "С++" "? Это практично?

Ответ 1

Язык позволяет:

extern "C" {
  #include "foo.h"
}

Что делать, если foo.h содержит что-то, что требует связи С++?

    void f_plain(const char *);
    extern "C++" void f_fancy(const std::string &);

То, как вы поддерживаете компоновщика счастливым.

Ответ 2

Нет реальной причины использовать extern "C++". Он просто выражает связь, которая является неявным дефолтом. Если у вас есть класс, в котором некоторые члены имеют внешнюю ссылку "C", вы можете пожелать явному состоянию, чтобы остальные были extern "С++".

Обратите внимание, что стандарт С++ определяет синтаксически extern "anystring". Он дает только формальные значения extern "C" и extern "C++". Поставщик компилятора может свободно определять extern "Pascal" или даже extern "COM+", если он нравится.

Ответ 3

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

extern "C" {
    void f();             // C linkage
    extern "C++" {
        void g();         // C++ linkage
        extern "C" void h(); // C linkage
        void g2();        // C++ linkage
    }
    extern "C++" void k();// C++ linkage
    void m();             // C linkage
}

Ответ 4

Два догадки:

  • Если вы находитесь в блоке extern "C", вы можете снова получить ссылку на язык С++, указав вложенный extern "C++".
  • Он резервирует связь C++, потому что это документ, определяющий С++. Кто находится в лучшем положении для определения языковой привязки C++, чем он сам. Он также обеспечивает полноту. То же самое, что и с signed/unsigned.

Прочитайте этот ответ, в котором объясняется extern "LanguageName" (например, GCC имеет extern "Java").

Ответ 5

Внешнему "C" ответили многие. Вариант использования для extern "С++" - это вызов функции библиотеки С++ в функции C. Случай суб-использования, который имеет значение, является связыванием библиотеки С++ с исходным кодом C с основной функцией. Подробнее об этом wiki page:

Ответ 6

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

Ответ 7

Здесь указывается, какое соглашение о ссылках использовать. Большинство языков знают, как установить связь с функцией стиля "С".

Вам нужно это в двух случаях:

  • C - или другие языки для этой материи - программа, вызывающая функцию, написанную на С++
  • Программа С++, вызывающая функцию, написанную на C

Пример:

// declared in function.h
void f1(void);

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

Если вы пишете

extern "C" void f1(void);

Теперь ссылка работает, потому что она использует соглашение C.

Ответ 8

Короткий ответ заключается в том, что вы можете использовать extern C, чтобы сообщить компилятору, чтобы он не использовал имя. Это означает, что вы можете связать биты кода C и С++ в одном проекте.

Ответ 9

extern "C" используется, чтобы сказать, что С++-функция должна иметь C-ссылку. Это означает, что это зависит от реализации, но nptmally отключает С++-манипуляцию (и, следовательно, перегрузку и строгую проверку типов). Вы используете его, когда у вас есть функция С++, которую вы хотите вызвать из C-кода:

extern "C" void Foo();   // can be called easily from C

Что касается extern "С++", я никогда не видел его в реальном коде, хотя это позволяет С++ Standard. Я думаю, это не-op.

Ответ 10

Причина №1, используемая extern "C", заключается в том, чтобы избежать правил смены имени С++. Это очень важно, если вы работаете на языке .Net и хотите, чтобы PInvoke в определенную собственную функцию. Единственный способ сделать это - с отключением имени.