Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563

    C++ [Compilazioe in base al sistema operativo]

    Buonasera
    Vorrei scrivere un programma in C++ che funziona indipendentemente dal sistema operativo, quindi multipiattaforma.
    Ho letto che grazie alle direttive preprocessore posso capire su quale sistema operativo mi trovo, tipo
    #ifdef _WIN32_
    //codicewin
    #else
    //codicelinux
    #endif

    Ma quella variabile WIN32 da dove salta fuori? Dove si definisce???

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    le definisce automaticamente il compilatore (non sono variabili ma macro)

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Utente di HTML.it L'avatar di DydBoy
    Registrato dal
    Jul 2005
    Messaggi
    165
    Nel senso che il codice macchina conterrà i due rami dell' #ifdef comunque e il ramo giusto viene scelto in fase di esecuzione?

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Il codice da includere nel programma viene selezionato a tempo di compilazione in base a quelle direttive e alla macro definita dal compilatore, non a tempo di esecuzione. E' semplicemente un modo piu comptatto di scrivere due versioni del programma, una con le istruzioni per un sistema e una con le istruzioni per l'atro.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  5. #5
    Utente di HTML.it L'avatar di DydBoy
    Registrato dal
    Jul 2005
    Messaggi
    165
    Grazie, gentilissimo.

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    E come si chiamano queste due macro?
    _Win32_
    _Linux_?
    Oppure
    Windows
    Linux?

    Mi piace troppo questo fatto del C/C++
    Compila in base alle tue esigenze

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Non è una funzionalità del c++, ma del compilatore, in linea di principio non è detto che queste macro siano definite,e non è detto che siano necessariamente definite facendo riferimento al sistema su cui si trova il compilatore.

    Se ad esempio utilizzi un compilatore C1 su windows che sai definisce una sua macro identificativa _C1_ e un compilatore C2 su linux che definisce una sua macro _C2_, allora se metti nel tuo programma:

    #ifdef _C1_
    ....
    #else
    #ifdef _C2_
    ...
    #endif
    #endif

    compilando con il compilatore c1 sarà incluso nel file il primo blocco di codice, se compili con c2 sarà incluso il secondo blocco di codice.

    Ad esempio il compialtore MinGW, che è quello usato da devc++ e mingw developers studio su windows, ha la macro WIN32 definita.

    Bisogna leggere la documentazione del compialtore per sapere quali macro sono definite, o anche leggere direttamente gli header file.

    In alternativa puoi crearti un tuo file system.h che cambia da un sistema all'altro in modo da definire in esso la macro; su windows lo fai cosi:

    #define _WINDOWS_

    mentre su linux lo fai cosi:

    #define _LINUX_


    tale file lo includi in tutti i tuoi sorgenti, e nel codice puoi scrovere:

    #ifdef _WINDOWS_
    ....
    #else
    #ifdef _LINUX_
    ...
    #endif
    #endif

    in questo modo ti basta cambiare solo l'unica riga del file system.h per portare un programma da un sistema all'altro.

    Un'alternativa ancora più pratica è quella di non utilizzare tale file per definire la macro, ma passare la macro da riga di comando durante la compilazione, ad esempio mingw su windows e gcc su linux accettano l'opzione -dNOME_MACRO per definire la macro NOME_MACRO. Cosi ad esempio per compilare un file su windows si puo utilizzare il seguente comando:

    gcc -d_WINDOWS_ nomeFile.c

    mentre su linux:

    gcc -d_LINUX_ nomeFile.c

    il compilatore definisce inquesto modo la macro _WINDOWS_ o _LINUX_ e nei sorgenti sarà eseguito un ramo o l'altro della direttiva #ifdef. (non ricordo se l'opzione deve inizare con -d o -D).

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Ah ecco, quindi deve essere una mia furbata...
    Magari potrei provare a fare un configure sia .exe che .bin che metta a posto il file SO.h
    Mi piace, proverò subito.
    In questo caso potrei fare un miniprogramma di C++ che fa cosi...

    codice:
    #include <iostram.h>
    #include <fstream.h>
    #include <stdlib.h>
    main() 
    [
        int SO;
          cout <<"Scegli il tuo sistema operativo. /n
                1. Win32 /n
                2.Linux /n"; 
          cin >> SO;
    ofstream SistemaOperativo("SO.h",ios::out);
    if (SO == 1)
    SistemaOperativo << "#define _Win32_";
    else
    SistemaOperativo << "#define _Linux_";
    cout <<"Sei pronto alla compilazione del programma";
    
    ]
    In pratica questo definisce il sistema operativo prima di lancirare la compilazione
    E' abbozzato, ma il concetto è quello, giusto?

  9. #9
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    No, cosi non va bene. Le direttive #ifdef sono risolte a tempo di compilazione, o meglio ancora prima della compilazione, durante la fase di preprocessing, ovvero la fase in cui gli header file vengono inclusi nel programa e tutto le macro vengono espanse, E' quindi prima della compilazione che il compilatore vede se è definita una macro piuttosto chel'altra inserendo nel programma solo il blocco corrispondente a quella macro. Dopodichè avviene la compilazione: quando il programma è compilato dell'altro blocco di codice non c'è piu traccia nel programma. A tempo di esecuzione ormai è già tutto deciso. La fase di preprocessing è sostanzialemnte una fase di sostituzione di parti di testo nel programma sorgente, e sul programma cosi trasformato avviene la compilazione.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Infatti io faccio avviare PRIMA questo eseguibile per scrivere nel file SO.h il sistema operativo
    e poi si avvia la compilazione, no?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.