PDA

Visualizza la versione completa : C/C++ - programmazione multipiattaforma


web@web
03-01-2005, 20:40
Da un po' di tempo mi interesso alla programmazione multipiattaforma per Win32 e Linux (non in Java o in .net/mono) e ho trovato questo

www.html (http://forum.html.it/forum/showthread.php?s=&threadid=654223&highlight=def+linux)

Come funziona la definizione delle variabili linux e win32?

E' una cosa definita dal sistema operativo in maniera trasparente per il programmatore o bisogna prelevare una qualche variabile d'ambiente?
Per le varie distribuzioni di Linux sempre valido 'linux'? e per le varie versioni di windows?

netarrow
03-01-2005, 21:27
Qui: http://docenti.ing.unipi.it/~d4544/fondamenti2/preprocessore.pdf

C' una dispensa sul preprocessore del C++ e parla anche dell'utilizzo per pilotare programmi multipiattaforma.

Ecco un esempio:



#ifdef _SUNOS
//code
#elseif _LINUX
//code
#elseif _HPUX
//code
#elseif _WIN32
//code
#else
#error OS non supportato
#endif


:ciauz:

:yuppi: 400 POSTS!!! :yuppi: :zizi:

web@web
03-01-2005, 21:53
Scusa ma su questo link parla dell'uso delle variabili per indirizzare il codice verso le istruzioni dedicate al SO.

Quello che mi chiedo se sia possibile da codice determinare il SO o se devo iniziare con un DEFINE linux se compilo in linux, DEFINE win32 se compilo in windows ecc..

netarrow
03-01-2005, 22:20
Originariamente inviato da web@web
Scusa ma su questo link parla dell'uso delle variabili per indirizzare il codice verso le istruzioni dedicate al SO.

Quello che mi chiedo se sia possibile da codice determinare il SO o se devo iniziare con un DEFINE linux se compilo in linux, DEFINE win32 se compilo in windows ecc..

tu non devi definire, controlli solo se gi definito:



#include <iostream.h>


#ifdef _WIN32
char* a = "WINDOWS\0";
#elif linux
char* a = "LINUX\0";
#else
#error OS non supportato
#endif

int main() {
cout << a << endl;

return 0;
}


Adesso ho provato su windows e infatti viene scritto WINDOWS, nel caso inverto:



#ifdef linux
char* a = "WINDOWS\0";
#elif _WIN32
char* a = "LINUX\0";
#else
#error OS non supportato
#endif


Viene scritto linux.

Se uso definizioni di OS che non ho:


#include <iostream.h>


#ifdef _SUNOS
char* a = "SunOS\0";
#elif _MAC//sar questo che indica mac... bh :-)
char* a = "Mac\0";
#else
#error OS non supportato
#endif

int main() {
cout << a << endl;

return 0;
}
A compile time viene lanciato un errore:

"OS non supportato"

Quindi _WIN32 viene riconosciuto, magari dopo provo a vedere se va in linux.

Intendevi questo?

:ciauz:

web@web
03-01-2005, 22:43
Scusa ma a volte mi riesce difficile farmi capire :( Porta pazienza :D

Tu scrivi


#ifdef _WIN32
char* a = "WINDOWS\0";
#elif linux
char* a = "LINUX\0";
#else
#error OS non supportato
#endif



Vuol dire che quando solo in linux (per esempio) la variabile 'linux' gi impostata? E viceversa se sono in windows impostata la variabile 'WIN32'?
Quello che volevo capire ioera proprio questo: si tratta di una sorta di automatismo, non devo gestire io del codice per individuare il SO.
Ho capito giusto?

netarrow
03-01-2005, 22:53
esatto, ho provato anche su linux adesso, il seguente codice:



#include <stdio.h>


#ifdef _WIN32
char* a = "WINDOWS\0";
#else
#ifdef linux
char* a = "LINUX\0";
#else
#error OS non supportato
#endif
#endif

int main() {
printf("%s\n", a);

return 0;
}



SU windows stampa WINDOWS, su linux LINUX.

Li dentro puoi pilotare la compilazione per includere gli header solo di win e solo di linux e poi astrarli con una nuova interfaccia che si adatta, ad esempio potresti fare un metodo con firma
"connetti(host, porta)", e il corpo si adatta tramite le direttive usando i file h del sistema ospite.

Un ultimo esempio che mi viene in mente quello per pulire lo schermo:



#include <stdio.h>
#include <stdlib.h>


#ifdef _WIN32
const char* pulisci = "cls";
#else
#ifdef linux
const char* pulisci = "clear";
#else
#error OS non supportato
#endif
#endif

int main() {
printf("Ciao");
system(pulisci);
return 0;
}




:ciauz:

netarrow
03-01-2005, 23:00
ah ovviamente, anche in linux se scrivo SUNOS e MAC gcc mi lancia l'errore durante la compilazione "os non supportato"

Loading