static vs extern " C " / " C++"
Jaka jest różnica między statyczną funkcją członową a zewnętrzną funkcją łącznika" C"? Na przykład, gdy używam "makecontext" w C++, muszę przekazać wskaźnik do funkcji. Google zaleca używanie do tego linku extern "C", ponieważ "makecontext" to C. ale dowiedziałem się, że używanie statycznych działa również. Mam szczęście...
class X {
public:
static void proxy(int i) {}
}
makecontext(..., (void (*)(void)) X::proxy, ...);
Vs
extern "C" void proxy(int i) {}
makecontext(..., (void (*)(void)) proxy, ...);
EDIT: czy możesz pokazać kompilator lub architekturę, w której statyczna wersja Członkowska nie działa (i nie jest błąd w kompilatorze)?
2 answers
Tak, masz po prostu szczęście :) extern " C "jest jednym z języków linkage dla języka C, który każdy kompilator C++ ma do obsługi, oprócz extern" C++", który jest domyślny. Kompilatory mogą obsługiwać inne powiązania językowe. Na przykład GCC obsługuje extern "Java", który pozwala na łączenie się z kodem Javy (choć jest to dość uciążliwe).
Extern " C " mówi kompilatorowi, że funkcja może być wywołana przez kod C. Które mogą, ale nie muszą, obejmować odpowiednią konwencję wywoływania i odpowiednia nazwa języka C (czasami nazywana "dekoracją") między innymi w zależności od implementacji. Jeśli masz statyczną funkcję członkowską, konwencja wywoławcza dla niej jest konwencją kompilatora C++. Często są one takie same jak w przypadku kompilatora C tej platformy - więc powiedziałem, że masz szczęście. Jeśli masz API C i przekazujesz wskaźnik funkcji, lepiej zawsze umieścić jeden do funkcji zadeklarowanej z extern" C " jak
extern "C" void foo() { ... }
Mimo, że typ wskaźnika funkcji nie zawiera specyfikacji powiązania, ale wygląda jak
void(*)(void)
Połączenie jest integralną częścią typu - po prostu nie można wyrazić go bezpośrednio bez typedef:
extern "C" typedef void(*extern_c_funptr_t)();
Kompilator Comeau C++, w trybie ścisłym, będzie emitował błąd, na przykład, jeśli spróbujesz przypisać adres extern " C " funkcji powyżej do (void(*)())
, beuse jest to wskaźnik do funkcji z C++ powiązania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-26 20:06:24