Gå til innhold

Hvilke syntax-regler gjelder her?


Anbefalte innlegg

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 av Pensarando
Lenke til kommentar
Videoannonse
Annonse

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 av Pensarando
Lenke til kommentar
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

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! :p)

Endret av LostOblivion
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...