Я должен вернуться к (встроенному) C через некоторое время с C ++, и у меня возникла следующая проблема:
У меня есть исходный модуль, который включается много раз, давайте назовем его utilities.h
и utilities.c
В нем у меня есть важный массив, давайте назовем его
#define IMPORTANT_ARRAY_LENGTH 10000
char important_array[IMPORTANT_ARRAY_LENGTH];
У меня есть много других функций в этом модуле utilities
, и все они работают нормально.Однако в одном из других исходных файлов, назовем его worker.c
, я должен использовать этот массив.Что такое «официальный», элегантный способ сделать это, не помещая extern char important_array[IMPORTANT_ARRAY_LENGTH]
и определение макроса в worker.c
?
Если я сделаю следующее:
утилиты.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
?Я хочу сохранить все в чистоте и иметь все объявления только в одном месте: в заголовочном файле.И я хочу иметь определение макроса только один раз (это вторично, потому что я мог бы использовать const, но я хочу, чтобы препроцессор обрабатывал его, а не занимал место)