Как уже упоминалось, избегайте использования тех же глобальных имен переменных/функций. Примените к ним префикс имени модуля. То есть 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
В module.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.
Убедитесь, что вы знаете разницу между декларацией и определением, а также extern vs. static.
Это раздражает меня тем, что учебники и курсы C либо игнорируют искусство, либо игнорируют искусство программирования с несколькими модулями.
EDIT: Я забыл упомянуть, что вы не должны вообще делать глобальные переменные доступными для других модулей (то есть сделать их «частное»). Если другим модулям необходимо получить доступ к этой переменной, предоставите «общедоступные» функции «setter» и/или «getter».
Хороший пример того, почему переменные не определены в заголовочных файлах. :-) –
Вы всегда должны * определять * глобальные переменные в файлах .c (это выделяет для них пространство) и * объявлять * их с помощью 'extern' в .h файлах (это делает их видимыми для других модулей). –