Я должен вернуться к (встроенному) 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
? Я хочу, чтобы все было в чистоте и чтобы все объявления были только в одном месте: в файле заголовка. И я хочу иметь определение макроса только один раз (это вторично, потому что я мог бы использовать константу, но я хочу, чтобы препроцессор обработал это, а не занимал место)