Как определить массив строк символов в заголовочном файле? - PullRequest
10 голосов
/ 08 февраля 2012

У меня много разных трехосевых датчиков, для которых я пишу тестовый код.В файлах C для каждого из них определена одна и та же строка символов:

char axis[3][8] = {"X", "Y", "Z"}

, которую я использую, когда получаю цикл «для», чтобы напечатать ось с ошибкой, например:

DEVICETEST_LOG("%s Failed %s axis for Min range\n",device_name[DUT], axis[i]);

Я думал, чтобы сэкономить место, я мог бы определить массив символьных строк в заголовочном файле, чтобы использовать его повсеместно.

Я пробовал несколько вещей, но я не могу получить массив строк, определенных в моем заголовочном файле, который я могу перебрать для прохождения компиляции.

Ответы [ 5 ]

21 голосов
/ 08 февраля 2012

Если вы должны поместить его в заголовочный файл, используйте extern или static:

// option 1
// .h
extern char axis[3][8];

// .c
char axis[3][8] = { "X", "Y", "Z" };

// option 2
// .h
static char axis[3][8] = { "X", "Y", "Z" };

Экстерн сообщает компоновщику, что есть глобальная переменная с именем axis, определенная в одном из наших файлов реализации (то есть в одном .c файле), и мне нужно сослаться на это здесь.

static, с другой стороны, говорит компилятору обратное: мне нужно иметь возможность видеть и использовать эту переменную, но не экспортировать ее в компоновщик, поэтому на нее нельзя ссылаться extern или вызвать конфликты имен.

12 голосов
/ 08 февраля 2012

Чтобы избежать ошибок компоновщика, вы должны объявить ваш массив как extern в заголовочном файле, а затем определить массив один раз в одном из ваших модулей кода.

Так, например:

//myheader.h
extern const char* axis[3];

тогда в другом модуле кода где-то:

//myfile.c
const char* axis[3] = { "X", "Y", "Z" };
2 голосов
/ 08 февраля 2012

Добавьте это в свой заголовок:

extern char *axis[];

Добавьте это в один исходный файл в вашем проекте:

char *axis[] = { "X", "Y", "Z", "Time", "Space", "The Scary Door" };
2 голосов
/ 08 февраля 2012

Поместите это в заголовочный файл

extern char axis[3][8];

и сохраните в файле C:

char axis[3][8] = {"X", "Y", "Z"};
0 голосов
/ 08 февраля 2012

Майкл Барр (Нетрино) не советует декларировать хранилище в заголовочном файле. Аналогичным образом, стандарт кодирования встроенной системы Netrino не оправдывает использование внешнего хранилища в заголовках.

Я в целом согласен с этими принципами, и я считаю хорошей идеей использовать внешнее хранилище в файлах C, которые в нем нуждаются, и только в тех.

...