Après avoir eu quelques problèmes pour configurer SDL, j'ai découvert que SDL définit une macro qui remplace main:
#define main SDL_main
// And then
extern C_LINKAGE int SDL_main(int argc, char *argv[]);
Cela peut également créer des erreurs de compilation, si la fonction principale n'a pas les paramètres argc
et argv
définis.
Cette macro me donne des maux de tête juste au moment où je la vois ... Pourquoi SDL doit-il redéfinir le principal? Après quelques recherches supplémentaires, j'ai constaté que certaines personnes #undef main
, et utilisez-le normalement.
Voici donc la question: pourquoi SDL doit-il redéfinir main, que fait-il? Y a-t-il des effets secondaires pour le définir?
Une chose que j'ai remarquée est que SDL redirige la sortie standard et les erreurs vers des fichiers (et je ne veux pas de ce comportement), et ce comportement s'arrête si je définis un main.
Par la FAQ Windows SDL :
Vous devez utiliser
main()
au lieu deWinMain()
même si vous créez une application Windows, car SDL fournit une version deWinMain()
qui effectue une initialisation SDL avant d'appeler votre Code principal.Si pour une raison quelconque vous devez utiliser
WinMain()
, jetez un œil au code source SDL danssrc/main/win32/SDL_main.c
Pour voir quel type d'initialisation vous devez faire dans votreWinMain()
pour que SDL fonctionne correctement.
SDL nécessite une initialisation, donc il injecte sa propre fonction main
qui exécute son initialisation avant d'appeler votre fonction "principale", qu'il renomme en SDL_main
Afin qu'elle n'entre pas en conflit avec la réelle main
. Comme indiqué dans la FAQ, votre fonction main
doit être de la forme
int main(int argc, char* argv[])
Bien que je convienne que c'est une pratique étrange, il existe des situations où c'est une solution raisonnable, même si cela dépend en grande partie de la plate-forme. Considérez que différentes plates-formes ont des points d'entrée différents. Windows est généralement WinMain, Linux est principal et interagit avec Android se produit en Java, WinRT utilise des extensions C++/CX, etc.). Le point d'entrée du programme et les API peuvent être très spécifiques à la plate-forme et SDL essaie de vous évite d'avoir à faire face à cela. Si vous ne ciblez que Windows et que SDL n'est là que pour vous éviter d'avoir à travailler avec l'API WIN32, vous n'en aurez peut-être pas besoin. Mais si vous allez au-delà du bureau, vous " ll le trouvera utile à mon avis.