Когда использовать extern "C" в C++?
Возможный дубликат:
Зачем нам нужен extern "C" {#include} в C++?
Я часто видел программы, закодированные как:
extern "C" bool doSomeWork() {
//
return true;
}
Почему мы используем extern "C"
блок? Можем ли мы заменить это чем-то в C++? Есть ли преимущество в использовании extern "C"
?
Я вижу ссылку, объясняющую это, но зачем нам что-то компилировать в C, когда у нас уже есть C++?
2 ответа
extern "C" делает имена не искаженными.
Используется когда:
Нам нужно использовать некоторую библиотеку C в C++
extern "C" int foo(int);
Нам нужно экспортировать код C++ в C
extern "C" int foo(int) { something; }
Нам нужна способность разрешать символы в разделяемой библиотеке - поэтому нам нужно избавиться от искажения
extern "C" int foo(int) { something; } /// typedef int (*foo_type)(int); foo_type f = (foo_type)dlsym(handle,"foo")
Единственное место, где extern "C" имеет смысл, - это когда вы ссылаетесь на библиотеку, которая была скомпилирована как код на C.
extern "C" {
#include "c_only_header.h"
}
В противном случае вы можете получить ошибки компоновщика, потому что библиотека содержит функции с C-linkage (_myfunc), но компилятор C++, который обработал заголовок библиотеки как код C++, сгенерировал имена символов C++ для функций ("_myfunc@XAZZYE" - это называется mangling и отличается для каждого компилятора).
Другое место, где используется extern "C", - это гарантия связи C даже для функций, написанных на C++, например.
extern "C" void __stdcall PrintHello() {
cout << "Hello World" << endl;
}
Такая функция может быть экспортирована в DLL и затем вызываться из другого языка программирования, потому что компиляция не будет искажать ее имя. Если вы добавили еще одну перегрузку той же функции, например.
extern "C" void __stdcall PrintHello() {
cout << "Hello World" << endl;
}
extern "C" void __stdcall PrintHello(const char *name) {
cout << "Hello, " << name << endl;
}
Тогда большинство компиляторов поймают это и, таким образом, не позволят вам использовать перегрузки функций в ваших публичных функциях DLL.