2012-12-07 13 views
11

jestem nowy i nauki C++ (know dużo Java) i następujący kod myli mnie ...Typ funkcji C++?

enter image description here

wiem, kod ten fragment ma do czynienia z funkcją wskaźnik do (jest to wywołanie zwrotne, które ma sens), ale to, co mnie wyrzuca, to argument między typem zwracanym a nazwą funkcji. Co to do cholery jest?

Wygląda na rodzaj funkcji, ale nigdy o niej nie słyszałem, a nawet po przeszukaniu i wyszukiwaniu informacji o wskaźnikach funkcji nie mogłem znaleźć niczego, co mogłoby wskazywać, że funkcje mogą mieć typ.

Jeśli to prawda, w jaki sposób zdefiniować typ funkcji?

Dzięki -Cody

+2

Co to za książka? I ten kod wygląda bliżej C niż C++ (biorąc pod uwagę, że wydaje mi się, że jest to książka OpenGL, która mnie nie zaskakuje). –

+1

Czy to nie jest konwencja wywołująca, tak jak w stdcall/fastcall/regcall ...? –

+0

Będziesz adnotacje w niektórych kompilatorach z konwencjami wywoływania. – rerun

Odpowiedz

10

GLFWCALL nie jest typem, jest makrem, które jest rozszerzone do konwencji wywoływania specyficznej dla platformy lub pustym łańcuchem. Oto przycięty fragment glfw.h:

#if defined(_WIN32) && defined(GLFW_BUILD_DLL) 
#define GLFWCALL  __stdcall 
#elif defined(_WIN32) && defined(GLFW_DLL) 
#define GLFWCALL  __stdcall 
#else 
/* We are either building/calling a static lib or we are non-win32 */ 
#define GLFWCALL 
#endif 

Korzystanie z prawidłową konwencja wywołania jest ważne na x86/win32, ponieważ niektóre z nich oczekiwać stos być czyszczone przez odbierającym i innych przez rozmówcę. Mogą również występować różnice w kolejności przekazywania argumentów.

+0

zauważ, że niektóre konwencje wywoływania (fastcall z <4 argumentami) w ogóle nie używają stosu. –

+1

Zależy od *, * także * fastcall :) MS fastcall używa ecx i edx, Borland używa eax/edx/ecx i Watcom wszystkie cztery eax/edx/ebx/ecx. –

+0

WAT? Istnieją różne wersje fastcall, które nazywa się fastcall? –

9

W Windows GLFWCALL to makro dla __stdcall i na innych platformach, to makro na nic.

__stdcall implementuje określoną konwencję wywołującą i jest rozszerzeniem kompilatora nad normalnym C lub C++.

Makra są fragmentami kodu, które zastępują kod, zanim lexer i analizator składni Twojego kompilatora oddziałują z nimi.

6

To GLFWCALL to makro, które można rozwinąć do calling convention, jeśli jest potrzebne. Ponieważ ta funkcja będzie wywoływana przez zewnętrzny kod, musi używać konwencji wywołania, której oczekuje zewnętrzny kod. Na przykład, jeśli funkcja umieszcza swoją wartość zwracaną na stosie, a kod zewnętrzny oczekuje jej w rejestrze, boomie.

1

Pytanie oznaczające część sygnatury funkcji jest makrem preprocesora zdefiniowanym gdzie indziej w nagłówku. Niektóre funkcje na niektórych platformach mają dodatkowe wymagania.

Na przykład funkcje w plikach DLL na platformie Windows często korzystają z modyfikatora __declspec (dllexport), ale gdy ten sam nagłówek jest zawarty w projekcie użytkownika, muszą używać __declspec (dllimport). Używanie makra preprocesora do tego celu oznacza, że ​​mogą po prostu użyć tego makra na wszystkich istotnych funkcjach i po prostu zdefiniować makro inaczej podczas kompilowania własnej biblioteki DLL lub biblioteki DLL użytkownika, a na platformach, gdzie __declspec jest nieistotny, można go zdefiniować w ogóle. Istnieje wiele innych powodów takich makr.

W tym konkretnym przypadku można skutecznie udawać, że makro jest puste i całkowicie je zignorować.