Самый элегантный способ совместного использования массива C

Я должен вернуться к (встроенному) C через некоторое время с C ++, и у меня возникла следующая проблема:

У меня есть исходный модуль, который включается много раз, назовем его utilities.h и коммунальные услуги.c В нем у меня есть важный массив, назовем его

#define IMPORTANT_ARRAY_LENGTH  10000
char important_array[IMPORTANT_ARRAY_LENGTH];

. У меня есть много других функций в этом модуле utilities , и все они работают нормально. Однако в одном из других исходных файлов, назовем его worker.c , я должен использовать этот массив. Каков "официальный" элегантный способ сделать это, не помещая extern char important_array [IMPORTANT_ARRAY_LENGTH] и определение макроса в worker.c ?

Если я сделайте следующее:

utilities.h

#ifndef _UTILITIES_H_
#define _UTILITIES_H_

#define IMPORTANT_ARRAY_LENGTH  10000
extern char important_array[IMPORTANT_ARRAY_LENGTH];

// ...

utilities.c

#ifndef _UTILITIES_C_
#define _UTILITIES_C_

#include "utilities.h"

char important_array[IMPORTANT_ARRAY_LENGTH];

// ...

worker.c

#include "utilities.h"
// ...
important_array[0] = 0;

, тогда мой массив будет неопределенным символом в worker.c . Если я не использую ключевое слово extern в utilities.h , то, конечно, это повторяющийся символ. (Как ни странно, он компилируется только с предупреждением, и я вижу из файла компоновщика, что размер выделяется несколько раз.)

Мне действительно нужно объявлять свой массив в worker.c ? Я хочу, чтобы все было в чистоте и чтобы все объявления были только в одном месте: в файле заголовка. И я хочу иметь определение макроса только один раз (это вторично, потому что я мог бы использовать константу, но я хочу, чтобы препроцессор обработал это, а не занимал место)

5
задан vsz 22 February 2012 в 12:52
поделиться