2010-03-25 4 views
1

// Fichier: foo.cComment faire pour compiler ce code?

static int var; 

void foo() 
{ 
var++; 
} 

// fin du fichier foo.c

// bar.c du fichier:

static int var; 

void bar() 
{ 
var++; 
} 

// fin du fichier bar.c

// fichier main.c

static int var; 
void main() 
{ 
foo(); 
bar(); 
printf("%d", var); 
} 

// fin du fichier main.c

Question: Est-ce compiler le programme ci-dessus? Si oui, quel sera le résultat?

J'ai testé le code et trouvé qu'il ne pouvait pas être compilé. J'essaie d'utiliser extern dans main.c pour utiliser la fonction foo() et bar() mais il n'a toujours pas pu être compilé.

+0

Cela fonctionne-t-il mieux en utilisant 'int main()' au lieu de 'void main()'? – zneak

+3

@nvl: Cela devrait être zéro. Séparez les fichiers correctement. – zneak

+1

Vous devez publier (a) les commandes que vous utilisez pour essayer de construire ceci et (b) les messages d'erreur que vous avez reçus du compilateur et/ou de l'éditeur de liens –

Répondre

6

main.c a quelques problèmes mineurs - il devrait être quelque chose comme ceci:

#include <stdio.h> 

static int var; 

extern void foo(); 
extern void bar(); 

int main(void) 
{ 
    foo(); 
    bar(); 
    printf("%d\n", var); 
    return 0; 
} 

Il faut construire OK comme ceci:

$ gcc -Wall main.c foo.c bar.c -o main 

et le résultat devrait être:

$ ./main 
0 
+0

GCC la compile réellement avec 'main.c' comme écrit dans la question. Il lance juste des avertissements à propos de la déclaration implicite sur le type de retour 'printf' et' main'. – che

+0

Pourquoi "extern" est-il nécessaire sur les prototypes de fonctions? –

+0

@jleeddev: extern n'est pas strictement nécessaire dans ce contexte mais il est considéré par certains comme un bon style –

4

j'attendre pour compiler et imprimer 0 (bien que si vous voulez le compiler en C++, vous devrez ajouter la déclaration s pour foo() et bar(), et en C ou C++, vous pouvez obtenir un avertissement que main() devrait vraiment revenir un int).

Puisque var est défini comme statique dans chacun des trois fichiers, vous avez vraiment trois variables distinctes qui ont toutes le même nom. Peut-être est-il plus facile de considérer chaque fichier comme définissant une structure contenant ses variables statiques. Ce que vous avez fait est appelé foo(), qui incrémente foo.var. Ensuite, vous avez appelé bar(), qui incrémente bar.var. Ensuite, vous avez imprimé main.var, qui a été initialisé à zéro et jamais modifié.

+0

+1 pour l'exhaustivité. –

0

Cette compile pour moi (même si avec un avertissement sur le type de retour de main()). Le résultat, en termes de ce que main() va imprimer, est indéterminé car vous n'avez pas initialisé la valeur de var dans main.c. Le résultat le plus probable lorsque le compilateur est appelé sans optimisations est zéro car le système d'exploitation aura mis à zéro la mémoire physique fournie au processus de stockage de données (le système d'exploitation le fait pour éviter la fuite de données confidentielles entre processus). Le qualificateur statique des définitions de variable var signifie que la variable n'est pas visible en dehors du fichier source dans lequel elle est définie. Cela signifie également que chacune des trois variables var obtient son propre emplacement de stockage.

Si l'on ajoute un printf("[module name] *var=%p\n", &var)-foo(), bar() et main() respectivement pour imprimer l'adresse de l'emplacement de mémoire qui stocke ces trois variables que vous devriez obtenir quelque chose comme ceci: -

foo() *var=0x8049620 
bar() *var=0x8049624 
main() *var=0x8049628 

Notez que chaque variable obtient son propre emplacement de stockage. Le code de chaque fichier source accédera à la version de var spécifique à ce fichier source. L'utilisation de static comme ceci dans les fichiers .c est généralement utilisée pour implémenter le concept d'information se cachant dans C.

0

Le code (tel quel) sera compilé et le résultat sera 0 (comme l'explique Jerry) car la variable static aura un fichier portée.

Mais, si vous incluez foo.c et bar.c dans main.c et compilez comme

gcc main.c 

alors le résultat sera 2 parce qu'il n'y aura qu'une seule variable globale var.

Questions connexes