Как уже упоминалось, избегайте использования одинаковых имен глобальных переменных / функций. Возьмите за правило ставить перед ними префикс имени модуля. То есть MODULE1_state, MODULE2_state и т. Д.
Если глобальная переменная будет использоваться только внутри одного исходного файла, не объявляйте ее в соответствующем заголовочном файле. Вместо этого объявите его в верхней части исходного файла и используйте ключевое слово static
. Переменные, которые должны быть доступны для других модулей, должны быть объявлены в заголовочном файле с помощью ключевого слова extern
. То же относится и к глобальным функциям. Это помогает поддерживать ту же самую публичную / частную дисциплину, которую вы обычно используете в объектно-ориентированном языке, таком как C ++, Java, C # и т. Д.
Пример:
В module.h:
#ifndef MODULE_H /* Header guard */
#define MODULE_H
/* Declarations for entities that CAN be accessed by other modules,
i.e. "public". */
extern int MOD_publicVariable;
extern void MOD_publicFunction(int arg);
#endif // MODULE_H
В модуле.c:
/* Definitions for entities that CAN be accessed by other modules,
i.e. "public". */
int MOD_publicVariable = 42;
void MOD_publicFunction(int arg) {...}
/* Declarations for entities that CAN'T be accessed by other modules,
i.e. "private". */
static double MOD_privateVariable = 12.34;
static void MOD_privateFunction1(void);
static void MOD_privateFunction2(void);
/* Function definitions. */
void MOD_privateFunction1(void) {
int localVariable; /* This doesn't need the module prefix. */
....
}
void MOD_privateFunction2(void) {
....
}
Префикс модуля (MOD_) может быть назван сразу после вашего модуля, или вы можете использовать сокращение. Поэкспериментируйте, и вы в конечном итоге остановитесь на соглашении, которое вам нравится. Последовательное использование префикса, подобного этому, эмулирует концепцию класса / модуля / пространства имен в языках OO.
Убедитесь, что вы знаете разницу между объявлением и определением и внешним и статическим.
Меня раздражает, что учебники и курсы по Си игнорируют искусство мультимодульного программирования или приукрашивают его.
EDIT:
Я забыл упомянуть, что вы вообще не должны делать глобальные переменные доступными для других модулей (то есть делать их «частными»). Если другие модули нуждаются в доступе к этой переменной, предоставьте функции «public» «setter» и / или «getter».