Pensarando Skrevet 13. juli 2009 Del Skrevet 13. juli 2009 (endret) Hei, Jeg har nesten all min programmeringserfaring i PHP, JavaScript og litt C#. Likevel skjer det at jeg vil sette meg inn i litt C++-kode. Jeg har lest meg opp i grunnleggende C++, men i kildekode fra den virkelige verden er det et element jeg ikke forstår. Og jeg beklager manglende fagspråk Case 1: Ved bruk av Win32-api int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { /* ... */ } Hva er egentlig "WINAPI"? En konstant? Eller en macro kanskje? Hvilken funksjon har den der mellom funksjons-typen og navnet? Case 2: Også ved Win32-api LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { /* ... */ } Her returneres LRESULT regner jeg med. Men hva gjør CALLBACK der? Case 3: Fra PHP sin kildekode (main/php_trics.c) PHPAPI void php_add_tick_function(void (*func)(int)) { TSRMLS_FETCH(); zend_llist_add_element(&PG(tick_functions), (void *)&func); } Her er et nytt eksempel. Men her står "PHPAPI" framfor viod. Jeg tror eksemplene er paralelle, men jeg lurer på hva det er. Viss det er macroer vet jeg i så fall altfor lite om dem. Gjør de noen nytte? Er det standard C++? Hvordan blir f.eks. PHPAPI definert? Hva kalles dette? Evt. noe bra lesestoff om emnet? Endret 14. juli 2009 av Pensarando Lenke til kommentar
Pensarando Skrevet 13. juli 2009 Forfatter Del Skrevet 13. juli 2009 (endret) Har sett litt nærmere på macroer nå og innsett at dette må være nettopp det. Jeg har aldri før forestilt meg at maroer kan brukes (les: misbrukes) så radikalt som i dette HelloWorld-eksempelet #include <iostream> #define PRINT(text) std::cout << text; #define MAIN int main() { #define ENDBRACKET } MAIN PRINT("Hello world"); return 0; ENDBRACKET I praksis er det jo nesten mulig å designe et nytt språk med macroer. Imponerende ... og PHPAPI blir definert tom i php.c #define PHPAPI Som altså vil si at den er helt unødvendig. Hva kan da være poenget med den? Fleksibilitet ved fremtidige og radikale endringer i koden? Automatisk dokumentasjon? Endret 14. juli 2009 av Pensarando Lenke til kommentar
Giddion Skrevet 13. juli 2009 Del Skrevet 13. juli 2009 Hei, Hei Case 1: Ved bruk av Win32-api int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { /* ... */ } Hva er egentlig "WINAPI"? En konstant? Eller en mackro kanskje? Hvilken funksjon har den der mellom funksjons-typen og navnet? Det er en macro som definerer Calling convention. Calling convention er ikke standard c/c++, men relativt vanlig. Case 2:Også ved Win32-api LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { /* ... */ } Her returneres LRESULT regner jeg med. Men hva gjør CALLBACK der? Se svar til Case 2 Case 3:Fra PHP sin kildekode (main/php_trics.c) PHPAPI void php_add_tick_function(void (*func)(int)) { TSRMLS_FETCH(); zend_llist_add_element(&PG(tick_functions), (void *)&func); } Her er et nytt eksempel. Men her står "PHPAPI" framfor viod. Hvis jeg ikke tar helt feil så brukes macroen til f. eks. si fra til kompilatoren at funksjonen skal eksporteres under en .dll/.so kompilering. Jeg tror eksemplene er paralelle, men jeg lurer på hva det er. Viss det er mackroer vet jeg i så fall altfor lite om dem. Gjør de noen nytte? Er det standard C++? Hvordan blir f.eks. PHPAPI definert? Hva kalles dette? Evt. noe bra lesestoff om emnet? Jeg vet ikke noen bøker, men hvis du ser på hva som macroen definerer og på den måten graver deg ned så (som du har gjort i den andre posten din) så kommer du som regel ned til noe du kan forstå eller søke på. Lykke til Lenke til kommentar
LostOblivion Skrevet 13. juli 2009 Del Skrevet 13. juli 2009 (endret) Calling convention er jo da avtalen mellom ditt program og den kompilerte koden i biblioteket (Win32) for hvem som rydder opp registre og sånt ved kall av funksjoner. :] I Visual Studio heter de _cdecl og _stdcall hvor _cdecl som regel er default for funksjoner hvor du ikke spesifiserer calling convention og _stdcall for de fleste Win32-funksjoner. Hvis du setter _stdcall foran en funksjon i Visual Studio vil funksjonen ikke kunne ta variadiske argumenter, noe som hinter til at kalt funksjon er ansvarlig for å rydde opp i registre. (Er langt fra stødig på dette her, så bare rett meg! ) Endret 13. juli 2009 av LostOblivion Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå