Ihre Frage macht nicht deutlich, was Sie unter "Komponente" und "Umfang" verstehen.
Wenn ich richtig verstehe, haben Sie ein einzelnes Programm (dh einzelne ausführbare und einzelne Prozess zur Laufzeit), die mehrere Bibliotheken (was Sie "Komponenten" nennen) und [einige von] diese Bibliotheken sind mit einem gemeinsamen logger
verknüpft Bibliothek. Sie möchten, dass alle diese Bibliotheken eine gemeinsame Variable log_level
definieren können, die in der Bibliothek logger
definiert ist. Ist mein Verständnis richtig?
Wenn Sie die log_level
als globale Variable im Quellcode der Bibliothek logger
definieren (dh einmal außerhalb des Bereichs einer Funktion definiert), haben Sie Zugriff auf diese globale Variable in jeder anderen Komponente/Bibliothek, die mit Ihrer verknüpft ist Programm, indem Sie es als extern
deklarieren.
@MSalters, ich denke, Sie haben Recht, aber ich wollte betonen, dass wenn ich statische Bibliothek zu mehreren Komponenten in meinem Prozess verknüpfen wird es separate Instanz dieser Bibliothek für jede dieser Komponenten generieren und nicht aktivieren Teilen der globalen Variablen. - Zohar81 gestern
Nein, die letzte Verknüpfung entfernt alle Duplikate derselben Bibliothek. Sie können die logger
-Bibliothek entweder nur einmal mit dem Programm oder mehrmals mit allen Komponenten/Bibliotheken verknüpfen (die schließlich mit dem Programm verknüpft sind), die gleiche einzelne Variable log_level
wird von allen geteilt.
// 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
/* ... */
}
Eine andere (und besser) Art und Weise ziemlich die gleiche Sache zu tun ist, definieren Sie Variablen als statisch log_level und eine Art von Accessor bieten, wie zum Beispiel:
// logger.lib : logger.h
extern void set_log_level(int log_level);
extern void log(const char* mesg);
Sie scheinen das Wort "Scope" auf eine nicht standardmäßige Weise zu verwenden, und sicherlich macht der Begriff "Festlegen des Gültigkeitsbereichs globaler Variablen" keinen Sinn. Der Gültigkeitsbereich einer globalen Variablen ist global, deshalb handelt es sich um eine Variable _global_. – MSalters
Also, wenn ich Sie richtig verstanden habe, möchten Sie verschiedene 'log_level' Werte für bestimmte Bibliotheken haben, die die Singleton' Logger' Instanz teilen? Eine gemeinsame Bibliothek ändert nichts für diese Situation. –
@MSalters, ich denke, Sie haben Recht, aber ich wollte betonen, dass, wenn ich statische Bibliothek zu mehreren Komponenten in meinem Prozess verknüpfen, wird es separate Instanz dieser Bibliothek für jede solche Komponente generieren und nicht Freigabe der globalen Variablen aktivieren. – Zohar81