Toon posts:

Allegro END_OF_MAIN macro

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben wat gaan prutsen met de Allegro Game Library. Nu gaat dat allemaal goed, mijn vraag gaat over het volgende:

http://www.allegro.cc/manual/api/using-allegro/end_of_main

Hier wordt beschreven wat de END_OF_MAIN macro doet. Nu staat er:
This macro uses some `magic' to mangle...
Hoe gebeurt dit? Ik weet dat je macros kan maken met de preprocessor commando's (define, ifndef,...) Maar ik ben nog nooit zoiets tegengekomen. Waarom staat er geen punt-komma achter de macro? En waarom krijg ik een 'unresolved external symbol _WinMain@16'-fout als ik het programa zonder END_OF_MAIN compileer?

Ik ben benieuwd hoe ze dit voor elkaar hebben gekregen :).

  • Soultaker
  • Registratie: September 2000
  • Nu online
Je kunt het zelf opzoeken. Wat er gebeurt is dat ze 'main' zelf herdefiniëren en met END_OF_MAIN de aangepaste functie aanroepen. Kijk maar in include/allegro/platform/alwin.h:
C:
1
2
3
4
5
6
7
8
#define main _mangled_main

#define END_OF_MAIN()                                                  \
                                                                       \
int __stdcall WinMain(void *hInst, void *hPrev, char *Cmd, int nShow)  \
{                                                                      \
    return _WinMain((void *)_mangled_main, hInst, hPrev, Cmd, nShow);  \
}


Als je dus een programma hebt als:
C:
1
2
3
4
5
int main()
{
   // code hier!
}
END_OF_MAIN()

en de Allegro-code wordt hiervóór ge-include, dan verandert de preprocessor dat in:
C:
1
2
3
4
5
6
7
8
9
int _mangled_main()
{
   // code hier!
}

int __stdcall WinMain(void *hInst, void *hPrev, char *Cmd, int nShow)
{
    return _WinMain((void *)_mangled_main, hInst, hPrev, Cmd, nShow);
}

Oftewel, je main-functie wordt hernoemd en een aparte WinMain-functie wordt gedefineerd met de juiste parameters, die vervolgens weer de echte main aanroept.

De puntkomma achter de macro-invocatie ontbreekt omdat achter een functie-declaratie geen puntkomma nodig is; een macro-invocatie is sowieso geen 'statement'. Zelf had ik die END_OF_MAIN macro waarschijnlijk gewoon zonder argumenten (dus "END_OF_MAIN" in plaats van "END_OF_MAIN()") gedefinieerd om dit soort verwarring te voorkomen, maar waarschijnlijk hebben ze die toch toegevoegd om consistent te blijven met END_OF_FUNCTION().

[ Voor 16% gewijzigd door Soultaker op 07-11-2006 20:54 ]


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
/offtopic

Allegro _/-\o_ daar heb ik C mee geleerd 10 jaar terug!

Verwijderd

Topicstarter
Bedankt SoulTaker! Ik snap nu zo'n beetje wat er gebeurt. Ik had wel al geprobeerd om in de header files te achterhalen hoe dit gebeurde maar ik snapte er eerlijk gezegd niet veel van.

Nogmaals bedankt! _/-\o_
Genoil schreef op dinsdag 07 november 2006 @ 20:58:
/offtopic

Allegro _/-\o_ daar heb ik C mee geleerd 10 jaar terug!
Het werkt erg makkelijk, eerst was ik m'n RPG'tje aan het maken puur met de Win32 API... maar Allegro werkt veel makkelijker :).

[ Voor 49% gewijzigd door Verwijderd op 07-11-2006 22:04 ]