2016-06-07 6 views
0

Ich habe eine statische Bibliothek, die Logger-Dienste bereitstellt, und sie ist mit mehreren Unterkomponenten in meinem C/C++ - Projekt verknüpft.Globale Variablen in einer Bibliothek, die durch mehrere Entitäten eines einzelnen Prozesses verbunden sind

Ich möchte den Geltungsbereich der globalen Variablen, die in logger definiert sind, auf alle Entitäten festlegen, die diese Bibliothek verlinken (zum Beispiel log_level), und ich frage mich, ob die Bibliothek zu dynamisch ändern würde. . würde es ?

+1

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

+0

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. –

+0

@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

Antwort

1

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); 

+0

danke für Sie umfassende Antwort. Nur um sicher zu gehen, was ist, wenn ich möchte, dass der Parameter 'log_level' für jede Komponente eindeutig ist, die die 'Logger' Bibliothek lädt? Wie soll ich das in diesem Fall umsetzen? Danke noch einmal ! – Zohar81

+0

@ Zohar81: Mit "Komponente" meinst du "statische Bibliothek" und mit "laden" meinst du "statisch verknüpft" mit der Logger-Bibliothek? Wenn alle diese Bibliotheken mit einer einzigen ausführbaren Datei verknüpft sind, müssen Sie nicht auf die mehrfache Verknüpfung von "logger" achten, da die Variable log_level eindeutig ist. – shrike