Создать массив внешних символов в C - PullRequest
17 голосов
/ 06 октября 2011

Как создать внешний массив символов в C?

Я пробовал различные способы определения char cmdval[128], но он всегда говорит undefined reference to 'cmdval'

Я хочу поместить строку в cmdval в файл first.c и использовать ее в другом файле second.c. Я попытался добавить файл global.h с extern char cmdval[128], но безуспешно.

UPDATE:

global.h

extern char cmdval[128];

first.c

#include "global.h"

char cmdval[128];

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

second.c

#include "global.h"

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

FAIL :( "неопределенная ссылка на` cmdval '"

EDIT: Я работаю в Linux (редактирую мини-ОС xv6, затем компилирую и запускаю ее в qemu), я не знаю, является ли это барьером

Ответы [ 4 ]

29 голосов
/ 06 октября 2011

Вы должны объявить это в файле .h

extern char cmdval[128];

А затем определите значение в first.c;

char cmdval[128];

Тогда все, что включает ваш файл .h, при условии, что оно связано с first.o, будет иметь к нему доступ.

Чтобы уточнить, "extern" говорит, что есть внешняя переменная, на которую она будет ссылаться ... если вы не объявите где-то cmdval, cmdval никогда не будет существовать, а ссылка extern никогда не будет ссылаться на что-либо.

Пример:

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);
}

Вы можете скомпилировать это с помощью:

gcc first.c second.c -o main

Или сначала создать .o файлы и связать их

gcc -c first.c -o first.o
gcc -c second.c -o second.o
gcc first.o second.o -o main
3 голосов
/ 06 октября 2011

Extern не значит найти его где-то, он меняет переменную linkage на external, что означает, что независимо от того, сколько раз вы объявляете переменную, он ссылается на одну и ту же вещь.

Например, они ссылаются на то же самое в c (не в c ++), по умолчанию глобальная переменная имеет связь external.

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

Проблема в том, что вы сначала должны скомпилировать их в .o, а затем связать.о вместе.

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

или

gcc first.c second.c
2 голосов
/ 06 октября 2011

У вас должна быть единица компиляции, в которой вы определяете переменную cmdval. Ключевое слово extern только объявляет , что переменная существует, но не определяет ее.

Поместите следующую строку в first.c, second.c или в другой файл C на ваш выбор:

char cmdval[128];
0 голосов
/ 06 октября 2011

В second.c

#include "global.h"

определить extern char cmdval[128] в global.h.

...