La déclaration d'une structure dans un en-tête rend mondiale

Il y a trois fichiers:
source1.c
source2.c
l'en-tête.h

Les deux sources-les fichiers inclut l'en-tête.

C'est le code de l'en-tête:

struct
{
    int a;
    int b
} x;

Ce qui se passe maintenant, c'est que la structure devient mondial et les deux sources-les fichiers partage maintenant la structure appelée x. Pourquoi est-ce arrivé?

Je sais que si vous écrivez le code suivant, il fera deux variables globales. Un pour chaque source fichiers. (ils ne partagent pas les globals)

int x = 0;

Le dernier morceau de code fait sens pour moi, mais je ne comprends vraiment pas l'un avec l'struct..

EDIT:

Hmm tout le monde ici pense que je devrais recevoir des erreurs d'édition de liens. Mon code actuel est pour un système embarqué (nxtOSEK). Je vais essayer de le convertir dans un programme C plus tard.

EDITEDIT:

Je suis de retour avec des exemples réguliers C. Comme vous pouvez le voir, il est non seulement possible avec les structures, mais aussi avec régulièrement des variables.

source1.c

#include "header.h"

int main(void)
{
    f();
    x = 1;
    f();
}

source2.c

#include "header.h"

void f()
{
    printf("source2: %i\n", x);
}

en-tête.h

#include <stdio.h>

int x;

Sortie

source2: 0
source2: 1

Remarque que x ne doit pas être déclaré pour qu'il fonctionne ou qu'il donne un éditeur de liens d'erreur comme tout le monde ici dit. (Je ne sais pas pourquoi ça marche avec les embeded système..)

Aussi, il semble que j'ai mal lu, Eric Postpischil réponse qui semble correct.

"Je sais que si vous écrivez le code suivant, il fera deux variables globales. Un pour chaque source de fichiers". Non, il ne sera pas.
Eh bien, c'est ce qui se passe.. Imaginez que source1.c est la mise à jour de x régulièrement et ils ont tous les deux l'impression de la valeur actuelle. Vous allez voir que la valeur de source2.c est jamais mis à jour.
Vous avez besoin de montrer compilabe code pour les trois fichiers (avec la structure et à l'int), et la commande(s) que vous avez utilisé pour compiler. Parce que vous ne faites pas ce que je pense que vous êtes en train de faire. Ce que je pense que vous faites dans la int cas les résultats dans un éditeur de liens d'erreur. Et apparemment, vous n'êtes pas en faisant ce soit de la answerers pense que vous êtes en train de faire, car ils ont également tous deux en désaccord avec vous quelles sont les causes d'erreurs d'édition de liens et ce qui ne fonctionne pas.
Utiliser un débogueur - seule étape à travers le code et vous entrez dans la "Matrice" - il sera clair -- en cristal clair.

OriginalL'auteur Sam Olesen | 2012-09-28