2011-01-13 8 views
3

Also arbeite ich an einem "schnell und schmutzig" Profiler für Firmware - ich muss nur wissen, wie lange einige Funktionen dauern. Lediglich das Drucken der Zeit, die es jedes Mal braucht, wird die Ergebnisse verfälschen, da die Protokollierung teuer ist. Daher speichere ich eine Menge Ergebnisse in einem Array und decke das nach einiger Zeit ab.Zugriff auf eine statische Variable einer Kompilationseinheit direkt von anderen, in C

Bei der Arbeit in einer Kompilierungseinheit (eine Quelldatei) hatte ich nur eine Reihe von statischen Arrays, die die Ergebnisse speichern. Jetzt muss ich das über mehrere Dateien machen. Ich könnte den Code "kopieren", aber das wäre nur hässlich (Bär mit mir). Wenn ich Timing-Code in eine separate Kompilierungseinheit einfüge, statische Variablen erzeuge und Accessor-Funktionen in der Header-Datei anbiete, werde ich jedes Mal, wenn ich auf diese statischen Variablen zugreifen möchte, den Overhead von Funktionsaufrufen übernehmen müssen.

Ist es möglich, direkt auf statische Variablen einer Übersetzungseinheit zuzugreifen?

Ich habe immer versucht, Daten zu kapseln, und nicht globale Variablen verwenden, aber diese Situation erfordert es einfach wegen der Geschwindigkeit Bedenken.

Ich hoffe, das macht Sinn! Vielen Dank!

BEARBEITEN: In Ordnung, so scheint es, was ich fragen ist unmöglich - jemand von Ihnen sehen Alternativen, die im Wesentlichen erlauben mir direkt auf Daten einer anderen Kompilierungseinheit zugreifen?

EDIT2: Vielen Dank für die Antworten Pablo und Jonathan. Ich akzeptierte schließlich Pablos, weil ich keinen klaren Platz hatte, um den Zeiger auf die statischen Daten (nach Jonathan) in meiner Situation zu bekommen. Danke noch einmal!

+0

Re: * Ich habe immer versucht, Daten zu kapseln, und keine globalen Variablen verwenden * Es gibt keine absoluten Regeln in der Programmierung. Für diesen speziellen Zweck würde ich sagen, dass es in Ordnung ist, eine globale Variable gemäß PAblos Antwort zu haben. – JeremyP

+0

Warum stellen Sie es nicht einfach mit einer Funktion aus? Das letzte Mal, als ich nachgesehen habe, waren wir im 21. Jahrhundert und Anrufe zu tätigen war nicht teuer. Bist du noch in den 1950ern? –

+0

@David Vielleicht blase ich das alles überproportional, aber ich teste gerade einen sehr zeitsensiblen Bereich der Firmware (kein PC, dies ist in einer Embedded-Umgebung), also zählt leider jede Uhr. –

Antwort

7

Nein, es ist nicht möglich, auf static Variablen einer Kompilierungseinheit von einer anderen zuzugreifen. static keyword verhindert genau das.

Wenn Sie Globals einer Übersetzungseinheit von einem anderen zugreifen müssen, können Sie tun:

file1.c:

int var_from_file1 = 10; 

file2.c:

extern int var_from_file1; 
// you can access var_from_file1 here 

Wenn Sie können Entfernen Sie das static Schlüsselwort aus Ihren Erklärungen, Sie sollten in Ordnung sein. Ich verstehe, dass das Ändern des vorhandenen Quellcodes nicht immer eine Option ist (I. E. Umgang mit existierendem veraltetem kompiliertem Code).

3

Um auf die statischen Variablen in einer Kompilationseinheit C1 von einer anderen Einheit C2 zuzugreifen, müssen einige Funktionen in C1 Zeiger auf die für C2 verfügbaren Variablen machen, oder einige nicht statische Variablen müssen einen Zeiger auf die statischen Variablen enthalten.

So könnten Sie die 'statischen Variablen' in einer einzigen Struktur verpacken und dann eine Funktion schreiben, die einen Zeiger auf diese Struktur zurückgibt; Sie können diese Funktion aufrufen, um auf die statischen Variablen zuzugreifen.

Ähnliche Regeln gelten für statische Funktionen; Wenn eine Funktion (oder eine nicht statische Variable) in der Datei die Zeiger auf die verfügbaren Funktionen bereitstellt, können die statischen Funktionen indirekt von außerhalb der Datei aufgerufen werden.

Wenn der Zugriff über Zeiger nicht als direkt zählt, dann sind Sie snookered; static verbirgt sich und Sie können nicht einblenden, außer indem Sie das Schlüsselwort static aus den Variablen entfernen, wenn das Modul kompiliert wird - vielleicht über den C-Präprozessor. Achten Sie auf Namenskonflikte.