Code: Select all
namespace boost {
namespace {
extern "C" void *thread_proxy(void *f)
{
....
}
} // anonymous
void thread::thread_start(...)
{
...
pthread_create(something,0,&thread_proxy,something_else);
...
}
} // boost
Es ist klar, dass die thread_proxy-Funktion privat intern ist, und ich erwarte nicht, dass sie als „thread_proxy“ entstellt wird, weil ich sie eigentlich überhaupt nicht entstellt brauche.
Tatsächlich habe ich in meinem gesamten Code, den ich geschrieben habe und der auf vielen Plattformen läuft, nie extern verwendet "C" und das hat wie gewohnt mit normalen Funktionen funktioniert.
Warum wird externes "C" hinzugefügt?
Mein Problem ist, dass externe "C"-Funktionen den globalen Namensraum verschmutzen und nicht wirklich versteckt sind, wie der Autor erwartet.
Ich spreche nicht von Mangel und externer Verknüpfung. In diesem Code wird deutlich, dass externe Verknüpfungen unerwünscht sind!
Antwort: Die Aufrufkonventionen von C- und C++-Funktionen sind nicht unbedingt identisch, daher müssen Sie eine mit der C-Aufrufkonvention erstellen. Siehe 7.5 (Seite 4) des C++-Standards.
Mobile version