web-dev-qa-db-fra.com

Créer un tableau de caractères externe en C

Comment créer un tableau de caractères externe en C? 

J'ai essayé différentes façons de définir char cmdval[128] mais cela dit toujours undefined reference to 'cmdval'

Je veux mettre une chaîne dans cmdval dans le fichier first.c et l'utiliser dans un autre fichier second.c. J'ai essayé d'ajouter un fichier global.h avec extern char cmdval[128] mais pas de chance.

METTRE À JOUR:

global.h

extern char cmdval[128];

first.c

#include "global.h"

char cmdval[128];

function(){
   strcpy(cmdval, "a string");
}

seconde.c

#include "global.h"

function(){
   printf("%s \n",cmdval); //error
}

FAIL :( "référence indéfinie à` cmdval '"

EDIT: Je travaille sous Linux (éditer un mini OS xv6 puis le compiler et l’exécuter dans qemu), je ne sais pas s’il s’agit d’un obstacle

17
SMUsamaShah

Vous devez le déclarer dans le fichier .h

extern char cmdval[128];

Et ensuite définir la valeur dans first.c;

char cmdval[128];

Ensuite, tout ce qui comprend votre fichier .h, à condition qu’il soit lié à first.o, y aura accès.

Pour élaborer, "extern" dit, il y a une variable externe que cela référencera ... si vous ne déclarez pas alors cmdval quelque part, cmdval n'existera jamais et la référence externe ne référencera jamais rien.

Exemple:

global.h:

extern char cmdval[128];

first.c:

#include "global.h"
char cmdval[128];

int main() {
  strcpy(cmdval, "testing");
  test();
}

second.c:

#include "global.h"

void test() {
  printf("%s\n", cmdval);
}

Vous pouvez compiler ceci en utilisant:

gcc first.c second.c -o main

Ou créez d’abord les fichiers .o et reliez-les

gcc -c first.c -o first.o
gcc -c second.c -o second.o
gcc first.o second.o -o main
29
Geoffrey

Extern ne signifie pas le trouver quelque part, il change la variable linkage en external, ce qui signifie que peu importe le nombre de fois que vous déclarez une variable, elle fait référence à la même chose.

par exemple. Celles-ci font référence à la même chose dans c (pas c ++), le lien d'une variable globale est par défaut external.

external char cmdval[128];
char cmdval[];
char cmdval[128];

Le problème est que vous devez d’abord les compiler en .o, puis les lier entre eux.

gcc -c first.c second.c
gcc -o first.o second.o

ou 

gcc first.c second.c
3
lostyzd

Vous devriez avoir une unité de compilation dans laquelle vous définissez la variable cmdval. Le mot clé externdéclare seulement que la variable existe, il ne la définit pas. 

Mettez la ligne suivante dans first.c, second.c ou dans un autre fichier C de votre choix:

char cmdval[128];
2
user811773

Dans second.c

#include "global.h"

définir extern char cmdval[128] dans global.h également.

0
Pete Houston