Я нахожу такие примеры в коде 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"
, и это работало как есть с нормальными функциями.
Почему добавлен extern "C"
?
Моя проблема в том, что функции extern "C"
загрязняют глобальное пространство имен, и они на самом деле не скрыты, как ожидает автор.
Это не дубликат! Я не говорю о механизме и внешней связи. В этом коде очевидно, что внешняя связь нежелательна!
Ответ: Вызывающие соглашения функций C и С++ не обязательно одинаковы, поэтому вам нужно создать их с помощью соглашения C-вызова. См. 7.5 (p4) стандарта С++.