2016-06-07 3 views
0

У меня есть статическая библиотека, которая предоставляет услуги логгера, и связана с несколькими подкомпонентами в моем проекте C/C++.Глобальные переменные в библиотеке, которые связаны несколькими объектами одного процесса

Я хотел бы задать область глобальных переменных, которая определена в logger всем тем объектам, которые связывают эту библиотеку (например, log_level), и мне интересно, изменит ли библиотека динамическую работу. не так ли?

+1

Вы, кажется, используете слово «область действия» нестандартным образом, и, конечно, понятие «настройка области глобальных переменных» не имеет смысла. Область глобальной переменной глобальна, поэтому она является переменной _global_. – MSalters

+0

Итак, если я правильно понял вас, вы хотите иметь разные значения «log_level» для конкретных библиотек, которые используют один экземпляр «logger»? Совместная библиотека ничего не изменит для этой ситуации. –

+0

@MSalters, я думаю, вы правы, но я хотел бы подчеркнуть, что если я свяжу статическую библиотеку с несколькими компонентами моего процесса, он будет генерировать отдельный экземпляр этой библиотеки для каждого такого компонента и не включать разделение глобальных переменных. – Zohar81

ответ

1

В вашем вопросе не ясно, что вы подразумеваете под «компонентом» и «областью».

Если я правильно понял, у вас есть одна программа (т.е. один исполняемый файл и один процесс во время выполнения), который включает в себя несколько библиотек (то, что вы называете «компонентами»), и [некоторые из] этих библиотек связаны с общим 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)  { /*...*/ } 
+0

благодарит за вас исчерпывающий ответ. Просто чтобы убедиться, что, если я хочу, чтобы параметр «log_level» был уникальным для каждого компонента, загружающего библиотеку «logger»? Как мне его реализовать в этом случае? еще раз спасибо ! – Zohar81

+0

@ Zohar81: «компонент», вы имеете в виду «статическую библиотеку» и «нагрузка», вы имеете в виду «статически связанную» с библиотекой журнала? если все эти библиотеки связаны с одним исполняемым файлом, вам не нужно заботиться о многократном связывании «logger», переменная log_level будет уникальной. – shrike

Смежные вопросы