2016-06-12 14 views
-2

Ich habe zwei Dateien: uart.c, hat es Schlepptau Variablen in den 4./5 Linien:Kann ich über einen Zeiger auf eine statische Variable einer Datei aus einer anderen Datei zugreifen? Diese Funktionen</p> <pre><code>void FIFOGet(FIFO* buffer, uint8_t* data, uint8_t length) </code></pre> <p>:

static FIFO inputBuffer; 
static FIFO outputBuffer; 

Und buffer.c, die FIFO structs zu verwalten sevenal Funktionen hat, wie sind für den allgemeinen Gebrauch, so dass ich nie mit inputBuffer in buffer.c direkt umgehen werde, nur über einen Zeiger. Die ablove Funktion wird von uart.c wie genannt:

FIFOGet(&inputBuffer, someArray, n) 

Aber innerhalb dieser Funktion verlor ich buffer ‚s-Wert (Ich weiß, dass inputBuffer bei 0x04f0 befindet, wenn ich die Funktion aufrufen, aber buffer‘ s-Wert ist 0x04ea - die zeigt auf outputBuffer, ich bin 140% sicher, dass der Funktionsaufruf in Ordnung ist, überlasse ich nicht outputBuffer). Dies passiert, weil ich inputBuffer als static deklariert habe? Wenn ja, werde ich es entfernen, aber sollte ich extern FIFO inputBuffer in buffer.c setzen? Ich hätte gerne, wenn jemand erklären könnte, wie es genau funktioniert.

+0

lesen Sie über 'statische' Variablen ... –

Antwort

0

In C werden standardmäßig alle Symbole im Dateibereich ("globale" Variablen und Funktionen) in der Objektdatei "veröffentlicht". Dies ist oft nützlich - verhindert aber auch, dass diese exakten Symbole von anderen Modulen veröffentlicht werden.

Wenn Sie also ein Dateisystem-Symbol nicht außerhalb der Datei aufrufen möchten, sollten Sie es als static deklarieren. Das bedeutet, dass das Symbol nicht in der Objektdatei veröffentlicht wird - das ist alles. Sie können weiterhin Zeiger auf dieses Symbol an andere Module übergeben: Sie können einfach nicht über den Namen darauf zugreifen.

Wenn Sie extern FIFO inputBuffer; in buffer.c setzen, erhalten Sie einen Linker-Fehler. Es würde durch alle Module nach einem veröffentlichten Symbol inputBuffer suchen - und nicht eins finden.

+0

Für die externe Sache, meine ich, nachdem ich' static'in 'uart.c' entferne, stelle ich' extern' in 'buffer.c', so dass die Variable wäre ein "echt-global", was für mich kein Problem ist. Aber ich werde auf diese Variable nur per Zeiger zugreifen, und ich bin mir nicht sicher, in diesem Fall hat "extern" irgendwelche Auswirkungen. – klenium

+0

Wenn Sie das 'static' entfernen, aber *' extern' nicht in 'buffer.c' einfügen, erhalten Sie einen Compilerfehler:' Unknown symbol inputBuffer'. Aber ich verstehe nicht: Sie sagen 'FIFOGet()' hat am Anfang den richtigen Wert für 'buffer', aber es wird _lost_? Ist das hier das Problem? Sie sollten nicht versuchen, 'inputBuffer' in' buffer' umzuordnen - Sie sollten herausfinden, wie 'buffer' den Wert an erster Stelle verloren hat! –