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)?

Author: Giovanni Funchal, 2009-02-26

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.

 33
Author: Johannes Schaub - litb,
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
 5
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54