В этой статье ключевое слово extern может сопровождаться "C" или "С++". Зачем вам использовать "extern "С++" "? Это практично?
Зачем вам использовать "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 в определенную собственную функцию. Единственный способ сделать это - с отключением имени.