[C++] Utilité de déclarer une variable en extern ?

Utilité de déclarer une variable en extern ? [C++] - Programmation

Marsh Posté le 16-07-2001 à 19:04:34    

Salut !
 
Je débute en C++, et lorsque que je déclare mes variables globales dans mon header, j'ai lu que je devais mettre le mot clé "extern" devant le type de ma variable globale...
 
A quoi sert ce "extern" ?
 
Merci de vos réponses :)


---------------
"Software is like sex it's better when it's free !!!! "
Reply

Marsh Posté le 16-07-2001 à 19:04:34   

Reply

Marsh Posté le 16-07-2001 à 20:48:58    

il y a 2 types de variable :
- locale
- globale
 
de preference et le plus souvent possible, il faut utiliser les variable locale (elles ne se logent pas dans la meme partie memoire que les locales et peuvent etre detruite par l'OS ....)
 
maintenant la syntaxe extern ne s'applique qu'aux variable globales
imaginons que tu es 2 fichiers *.cpp qui font references à la meme variable globale
tu declares ta variable globale dans les 2 fichiers *.cpp
mais si tu fais ca, tu vas creer 2 fois une zone memoire pour la meme variable lors de la compilation
alors tu mets une des 2 declarations de ta variable avec la syntaxe extern devant, comme ca le compilo, quand il trouve l'instruction extern, ne reserve pas de memoire pour la variable globale.
 
ex :
 
fichier01.cpp
#include "header.h"
int VARIABLE;
 
fichier02.cpp
#include "header.h"
extern int VARIABLE;
 
fichier03.cpp
#include "header.h"
extern int VARIABLE;
 
etc...

Reply

Marsh Posté le 18-07-2001 à 09:33:55    

"il faut utiliser les variable locale ( [..] et peuvent etre detruite par l'OS ....)"
:??:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 18-07-2001 à 11:10:53    

les variables locales ne se logent pas dans la m zone memoire que les variable globales..
 
les variables locales se situent dans le stack alors que les variables globales se mettent dans un zone de la mémoire conventionnelle et cette zone n'est liberé que lors de la fermeture du programme. De plus, plus tu crees de variable globales et moins tu as de memoire pour ton programme.
 
Contrairement au variable globale, les variables locales se mettent dans le stack (pile fifo) géré par l'OS ou le compilateur le cas echeant. Quand la variable locale est détruite, elle est enlevé du stack et laisse la place pour une autre variable locale.
 
Voila pourquoi, il faut previlegier les variables locales au globales.

Reply

Marsh Posté le 18-07-2001 à 11:25:15    

D'autres raison d'éviter les variables globales :
 ça rend les sources des gros programmes ilisibles
 ça complique la tache quand le programme est multithread


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
Reply

Marsh Posté le 18-07-2001 à 12:02:18    

"les variables locales se mettent dans le stack (pile fifo) géré par l'OS ou le compilateur le cas echeant"
 
ca je sais qu'elles sont dans la pile
ce ke je comprend pas c'est en quoi l'OS gere la pile ?
c'est le compilo = le programme qui se la gere
 
quand tu cree une variables locale, le programme incremente le pointeur de pile de la taille de cette variable
quand la fonction est terminee, il re-initialise le pointeur avec son acienne valeur
je vois pas où l'OS intervient
 
cela fait ressurgir une vieille question
j'avais lu dans un magazine consacre a la securite sous LINUX que pour empecher les buffer overflow, on pouvait compiler son noyaux en interdisant d'ecrire dans la pile
j'aimerais bien savoir comment cela est possible
dans ce cas, les programmes ne peuvent plus faire de PUSH ou POP, et ils sont rudement emmerdes
ou alors y'a un truc ?
pouvez vous m'eclairer :??: :)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 27-04-2004 à 11:24:52    

Quel newbie ce HelloWorld.
Alors voilà je t'explique : il s'agit d'interdire l'exécution de code se trouvant dans la pile, chose malheureusement pas possible sous x86 car Intel ne permet pas de créer un segment en lecture qui ne soit pas exécutable.

Reply

Marsh Posté le 27-04-2004 à 11:48:35    

[:666rip666]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed