Почему вы используете 'extern" C++"?
в этой статьи за ключевым словом extern может следовать "C"или" C++". Почему вы используете 'extern" 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