Добавьте свое объявление в некоторый файл .h, который включен в оба файла .c.Определите его в одном из файлов.
Конечно, это не может быть объявлено static
, чтобы это работало, поскольку ключевое слово static
обещает, что имя не понадобится за пределами этогоконкретный модуль.
Например, в prog.h
:
extern char *Foo;
в prog.c
:
#include "prog.h"
#include "log.c"
#include "library.c"
char * Foo; // make sure that Foo has a definition
// some code probably wants to make Foo have a value other than NULL
в log.c
:
//... other includes
#include "prog.h" // and now Foo is a known name
// some code here is using the global variable Foo
Теперь, к плохим новостям.
Подобные действия создают связь между модулями prog.c
и log.c
.Эта связь увеличивает стоимость обслуживания вашего приложения в целом.Одна из причин заключается в том, что нет способа помешать другим модулям использовать глобальную переменную.Хуже того, они могут использовать его совершенно случайно, потому что его имя недостаточно наглядно.
Хуже того, глобальные переменные значительно затрудняют переход от однопоточных программ к многопоточным программам.Каждая глобальная переменная, к которой можно получить доступ из более чем одного потока, является потенциальным источником действительно трудно диагностируемых ошибок.Лекарство заключается в защите информации, которая должна быть глобальной с объектами синхронизации, но чрезмерно используемой, что может привести к тому, что приложение, в котором заблокированы все потоки, кроме того, которое в данный момент использует глобальный, делает многопоточное приложение эффективно однопоточным.
Конечно, бывают случаи, когда межмодульная связь, подразумеваемая глобальными переменными, является приемлемой.Один вариант использования предназначен для общих применений.Например, если ваше приложение поддерживает параметр --verbose
, который заставляет его болтать во время работы, то имеет смысл, чтобы флаг, установленный параметром и проверенный по всему коду, был глобальной переменной.
В SO, безусловно, есть вопросы, которые глубоко вникают в ловушки глобалов и дают рекомендации по их разумному использованию.