Perché SDL definisce macro principale?

Dopo aver avuto qualche problema nell’impostazione di SDL, ho scoperto che SDL definisce una macro che sostituisce main:

#define main SDL_main // And then extern C_LINKAGE int SDL_main(int argc, char *argv[]); 

Questo può anche creare errori di compilazione, se la funzione principale non ha i parametri argc e argv definiti.

Questa macro mi dà mal di testa proprio quando la vedo … Perché SDL ha bisogno di ridefinire main? Dopo un po ‘di ricerche, ho scoperto che alcune persone sono #undef main , e lo usano nel modo normale.

Quindi questa è la domanda: perché SDL ha bisogno di ridefinire main, cosa fa? Ci sono effetti collaterali alla sua definizione?

Una cosa che ho notato è che SDL reindirizza l’output standard e l’errore nei file (e non voglio questo comportamento), e questo comportamento si interrompe se ho undefine principale.

    Per le domande frequenti su SDL Windows :

    Dovresti utilizzare main() invece di WinMain() anche se stai creando un’applicazione Windows, perché SDL fornisce una versione di WinMain() che esegue l’inizializzazione di SDL prima di chiamare il codice principale.

    Se per qualche motivo hai bisogno di usare WinMain() , dai un’occhiata al codice sorgente SDL in src/main/win32/SDL_main.c per vedere che tipo di inizializzazione devi eseguire nella tua funzione WinMain() modo che SDL funzioni propriamente.

    SDL richiede l’inizializzazione, quindi inietta la propria funzione main che esegue l’inizializzazione prima di chiamare la funzione “principale”, che rinomina in SDL_main modo che non sia in conflitto con la funzione main effettiva. Come indicato nelle FAQ, la tua funzione main deve essere nella forma

     int main(int argc, char* argv[]) 

    Mentre sono d’accordo che è una pratica strana, ci sono situazioni in cui questa è una soluzione ragionevole, anche se dipende in gran parte dalla piattaforma. Considera che piattaforms diverse hanno diversi punti di accesso. Windows è in genere WinMain, Linux è principale, l’interazione con Android avviene in Java, WinRT utilizza estensioni C ++ / CX e così via. Il punto di ingresso del programma e le API possono essere molto specifici della piattaforma e SDL cerca di risparmiarti la fatica di doverlo fare. Se il tuo targeting è solo per Windows e SDL è lì solo per risparmiare la fatica di lavorare con l’API WIN32, potresti non averne bisogno. Ma se mai andrai oltre il desktop, lo troverai utile secondo me.