tu veux dire pourquoi il faut le mettre spécifiquement avec un programme SDL, ou en toute généralité ?
En toute généralité, ça sers à lire les paramètres données au programme sur la ligne de commande (argc donne le nombre de paramètres de la ligne de commande et argv est un tableau qui contient argc chaine decaractères (donc c´est un tableau de tableau de char, d´où les **)).
Avec la SDL, c´est par ce que l´architecte de cette lib à coder avec ses pieds. Et sous windows, il a absolument besoin d´effectuer des bouts de code avant que ton programme ne se lance (c´est idiot, mais c´est comme ça). Alors il y a une fonction main dans la bibliothèque (dans le fichier libSDLmain.a pour être précis je crois, c´est à ça qu´il sers, et il y a fichiers deux car il n´existe par sur les autres OS (ce fichier là)) qui sera utilisé par le compilateur comme fonction de démarrage.
Et pour que ça ne plante pas dans l´un des header de la bibliothèque (SDLmain.h ?) il y a un truc du genre :
- define main SDL_main
et donc ta fonction main est renomé par le compilo en SDL_main et non pas en main. Et à la fin de la vraie fonction main, le programmeur de la SDL appelle la fonction main. Mais comme elle n´est défini nulle part, il a du en écrire un prototype, et comme il ne pouvait pas savoir si tu allais te servir ou non des arguments de la ligne de commande, il a écrit son prototype sur le modèle :
int main(int,char**);
Et donc ta fonction main est obligé d´avoir le même prototype pour qur l´édition des liens puisse s´effectuer.
Tout celà c´est stupide et inutile (et même contraignant dans certain cas), c´est l´une des raisons qui font que je n´aime pas cette bibliothèque.