Hello,
j'aimerais savoir si il est possible dans un programme C de savoir sous quel système d'exploitation le programme est lancé? (entre autre j'aimerais faire la différence entre windows et linux...)
Hello,
j'aimerais savoir si il est possible dans un programme C de savoir sous quel système d'exploitation le programme est lancé? (entre autre j'aimerais faire la différence entre windows et linux...)
Bonjour,
Ton programme va être compilé pour une cible. Même si tu fais du code le plus portable possible (ce qui est plus que recommandé), le binaire produit sera forcément différent.
Donc si tu compiles pour un OS "A", le test va être simple :
Si tu es sur une machine avec l'OS "A", ton programme va s'exécuter
Si tu es sur un autre OS non compatible avec l'OS "A", alors ton programme ne va pas s'exécuter.
C'est un bon moyen de différencier un OS....
Oui c'est sur... mais j'aimerai pouvoir différencier les OS dans le programme même, afin par exemple d'appeler une fonction différente selon l'OS...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 si(OS == WIN) alors fonction1() sinon fonction2()
Bonjour,
de façon standard ce n'est pas facile
Sous Windows il existe une variable d'environnement nommée OS, sous Linux, tu peux essayer de récupérer le résultat de la commande uname.
La glib fournie des macro pour cela : Standard Macros, si tu as le courrage de regarder les sources (très claires), cela pourra peut être t'aider![]()
Le problème n'est pas de savoir sur quel OS il est lancé (il est trop tard pour se poser la question), mais pour quel OS on va générer le code.Envoyé par vinzzzz
C'est là qu'intervient la compilation conditionelle. Comme la façon d'identifier les cibles n'est pas standard, je recommande une dénomination 'indépendante' du type
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part -DOS=OS_LINUX_2_4_X86
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part -DOS=OS_LINUX_2_6_PPC
etc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part -DOS=OS_WINDOWS_XP
à mettre sur la ligne de commande avec dans le code un
et dans l'implémentation, on différencie avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #ifndef H_OS #define H_OS /* os.h */ /* on a que 16 bits de facon portable... 1111 11 5432 1098 7654 3210 OS Version Cible Reserve */ #define OS_OS_LINUX 0x1000 #define OS_OS_WINDOWS 0x2000 #define OS_LINUX_VER_2_4 0x0100 #define OS_LINUX_VER_2_6 0x0200 #define OS_WINDOWS_VER_3x 0x0100 #define OS_WINDOWS_VER_9x 0x0200 #define OS_WINDOWS_VER_XP 0x0300 #define OS_CIBLE_X86 0x0010 #define OS_CIBLE_PPC 0x0020 #define OS_CIBLE_SPARC 0x0030 #define OS_LINUX_2_4_X86 (OS_OS_LINUX | OS_LINUX_VER_2_4 | OS_CIBLE_X86) /* etc. */ #endif /* guard */
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #if (OS == OS_LINUX_2_4_X86) /* code specifique... */ #endif
je vais voir ca merci
Par contre la glib c'est du C standart? ou il faut que je l'ajoute?
je suis quand même décu je pensais que ca existait de façon standart, ca peut quand même être utile...
g = GNU : c'est pas standard (mais très portable. En gros partout où il y a gcc...)Envoyé par vinzzzz
C'est pas possible. Quand on conçoit un langage portable (donc indépendant de la plateforme), par-définition, on ne sait pas sur quelles plateformes il va tourner...je suis quand même décu je pensais que ca existait de façon standart, ca peut quand même être utile...
En fait j'avais mal formulé ma questions, je m'en suis rendu compte avec le post d'Emmanuel.
Ce que je voulais faire ressemble a ceci:
Ce n'est donc pas pendant le programme mais avant, pour justement définir les macro selon l'OS...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #if (OS == OS_LINUX) #define MACRO fonction_linux(...)... #else #define MACRO fonction_win(...)...
Et mon pb était de savoir si il existait déjà une macro permettant de déterminer l'OS, de manière standart...
Par contre je n'ai pas bien compris ta méthode Emmanuel... (je suis toujours étudiant, donc relativement ignorant et dépourvu d'expérience)
Oui ca parait logique autant pour moi...[/code]C'est pas possible. Quand on conçoit un langage portable (donc indépendant de la plateforme), par-définition, on ne sait pas sur quelles plateformes il va tourner...
Ok, on va simplifier :Envoyé par vinzzzz
Quand tu compiles pour Windows, tu définies OS_WINDOWS globalement avec -D ou une config de l'IDE et quand c'est pour Linux, OS_LINUX
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #if defined (OS_LINUX) #define MACRO fonction_linux(...)... #elif defined (OS_WINDOWS) #define MACRO fonction_win(...)... #else #error not defined for this platform #endif
ok!! c'est ce qu'il me faut merci bien![]()
Partager