Зачем вам нужен «extern C» для обратных вызовов C++ к функциям C?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Зачем вам нужен «extern C» для обратных вызовов C++ к функциям C?

Сообщение Anonymous »

Такие примеры я нашел в коде Boost.

Код: Выделить всё

namespace boost {
namespace {
extern "C" void *thread_proxy(void *f)
{
....
}

} // anonymous
void thread::thread_start(...)
{
...
pthread_create(something,0,&thread_proxy,something_else);
...
}
} // boost
Зачем вам вообще нужен этот extern "C"?
Понятно, что функция thread_proxy является частной внутренней, и я не ожидаю, что она будет искажена как "thread_proxy", потому что на самом деле мне она вообще не нужна.
Фактически, во всем моем коде, который я написал и который работает на многих платформах, я никогда не использовал extern "C", и это работало так же, как и с обычными функциями.
Почему добавлен внешний "C"?

Моя проблема в том, что внешние функции "C" загрязняют глобальное пространство имен и на самом деле они не скрыты, как ожидает автор.
Я не говорю об искажении и внешней связи. В этом коде очевидно, что внешняя связь нежелательна!
Ответ: Соглашения о вызовах функций C и C++ не обязательно совпадают, поэтому вам необходимо создать соглашение с соглашением о вызовах C. См. раздел 7.5 (стр. 4) стандарта C++.

Подробнее здесь: https://stackoverflow.com/questions/259 ... -functions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»