В вашем вопросе не ясно, что вы подразумеваете под «компонентом» и «областью».
Если я правильно понял, у вас есть одна программа (т.е. один исполняемый файл и один процесс во время выполнения), который включает в себя несколько библиотек (то, что вы называете «компонентами»), и [некоторые из] этих библиотек связаны с общим logger
библиотека. Вы хотите, чтобы все эти библиотеки могли устанавливать общую переменную log_level
, определенную в библиотеке logger
. Правильно ли я понимаю?
Если вы определяете log_level
как глобальную переменную в исходном коде библиотеки logger
(т. Е. Определенную за пределами области действия любой функции), у вас будет доступ к этой глобальной переменной в любом другом компоненте/библиотеке, связанной с вашим , объявив его extern
.
@MSalters, я думаю, вы правы, но я хотел бы подчеркнуть, что если я свяжу статическую библиотеку с несколькими компонентами в моем процессе, она будет генерировать отдельный экземпляр этой библиотеки для каждого такого компонента и не включать обмен глобальными переменными. - Zohar81 вчера
Нет, окончательная ссылка удалит любой дубликат той же библиотеки. Вы можете связать библиотеку logger
либо один раз с программой, либо несколько раз для каждого компонента/библиотеки (которые, наконец, связаны вместе с программой), одна и та же единственная переменная log_level
будет доступна всем.
// logger.lib : logger.h
extern int log_level;
extern void log(const char* mesg);
// logger.lib : logger.c
int log_level;
void log(const char* mesg) { /*...*/ }
// component1.lib : component1.c
#include "logger.h" // declare log_level as extern
void component1()
{
log_level = 1; // modifies log_level defined in logger.c
/* ... */
}
Другой (и лучше) способ сделать совсем то же самое определение вы log_level переменную как статические и обеспечивают некоторый вид аксессору, такие как:
// logger.lib : logger.h
extern void set_log_level(int log_level);
extern void log(const char* mesg);
// logger.lib : logger.c
static int s_log_level; // only visible to logger.c
void set_log_level(int log_level) { s_log_level = log_level; }
void log(const char* mesg) { /*...*/ }
Вы, кажется, используете слово «область действия» нестандартным образом, и, конечно, понятие «настройка области глобальных переменных» не имеет смысла. Область глобальной переменной глобальна, поэтому она является переменной _global_. – MSalters
Итак, если я правильно понял вас, вы хотите иметь разные значения «log_level» для конкретных библиотек, которые используют один экземпляр «logger»? Совместная библиотека ничего не изменит для этой ситуации. –
@MSalters, я думаю, вы правы, но я хотел бы подчеркнуть, что если я свяжу статическую библиотеку с несколькими компонентами моего процесса, он будет генерировать отдельный экземпляр этой библиотеки для каждого такого компонента и не включать разделение глобальных переменных. – Zohar81