Почему вы используете 'extern" C++"?



в этой статьи за ключевым словом extern может следовать "C"или" C++". Почему вы используете 'extern" C++"? Это практично?

397   10  
c

10 ответов:

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

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

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

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

вот как вы держите линкер счастлив.

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

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

Я не уверен, зачем вам это нужно, но согласно этой статья от Sun, вы можете использовать extern "C++" внутри блока extern "C", чтобы указать определенные функции в группе функций "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
}

две догадки:

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

читать ответ поясняет, что extern "LanguageName" (т. е. GCC имеет extern "Java") хорошо.

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

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

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

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

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

пример :

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

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

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

extern "C" void f1(void);

теперь связь работает, потому что он использует C конвенции.

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

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

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

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

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

Comments

    Ничего не найдено.