PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Konzeptfrage: static declared functions



7.e.Q
09-11-2004, 08:29
Hallo,

sorry für den Roman, aber bitte trotzdem lesen! Danke!

wir haben hier einen Treiber, wie viele von euch bestimmt schon mitbekommen haben. Wir bauen ihn aus alten Sourcen wieder zusammen, damit er auf 'nem 2.6er Kernel funktioniert. Teilweise Funktionalität ist auch bereits implementiert und funktioniert. Aber mir fällt immer wieder auf, daß in dem Source globale funktionen als 'static' deklariert wurden. Ist das überhaupt noch notwendig? Ich hab weniger Schwierigkeiten, den Code zu verstehen (und der Kompiler offenbar auch), wenn die Funktionen und Variablen zwar global aber NICHT static sind. Wozu wurden die damals static deklariert? Was hat sich der Entwickler wohl dabei gedacht? Und weiter, kann man den Funktionen einfach das static (sowohl im Prototyp als auch im Funktionsheader) klauen? Viele der Funktionen werden als Funktionszeiger an Strukturen übergeben (logisch, Treiberentwicklung halt). Geht das auch noch, wenn die Funktionen nicht static sind?

Was static bewirkt, weiß ich wohl, zumindest im Bezug auf Variablen - nämlich, daß sie eine statische Adresse im Speicher erhalten. Aber wieso wird das auch bei globalen Variablen gemacht, die eh Modul-übergreifend die selbe Adresse haben?

Gestern hatten wir nämlich das Problem, daß eine Variable mit dem gleichen Namen in zwei Modulen auftauchte (sollte auch die selbe Variable sein). Sie war static deklariert und erhielt eigenartigerweise aus dem Modul, das sie initialisieren sollte, einen anderen Wert, als später in dem Modul, das auf sie zugriff. Die Initialisierungsfunktion des einen Moduls alloziierte einen Speicherbereich für die Variable, im anderen Modul zeigte der Zeiger dieser Variablen nach der Initialisierung aber immernoch auf 0x000000. Das änderte sich erst, nachdem ich die Variable als nicht mehr static deklariert habe. Danach funktionierte die Initialisierung wunderbar wie sie sollte.

Viele Fragen, die ihr hoffentlich alle reichhaltig beantworten könnt.

Danke!

Gruß,
Hendrik

wraith
09-11-2004, 09:03
Erstmal zum weiteren Verständnis.
Wenn eine globale Variable/oder Funktion static deklariert ist, dann bedeutet das, daß die Sichtbarkeit auf das C-Dot-File beschränkt ist, wo sie definert ist.
D.h. du kannst zwei C-Dot-Files haben, die jeweils eine Variable gleichen Namens definieren, aber es sind zwei verschiedene (sie haben unterschiedliche Adressen).
Würdest du das static entfernen, dann wäre die Sichtbarkeit nicht mehr auf das jeweilige C-Dot-File beschränkt, und beim linken gäbe es Probleme ("blabla already defined in ...).

Um also auf das "Ist das überhaupt noch notwendig?" zu kommen, es ist nicht nur nötig, es gehört zum guten Programmierstil, die Sichtbarkeit von Variablen auf das möglichste zu begrenzen.



Viele der Funktionen werden als Funktionszeiger an Strukturen übergeben (logisch, Treiberentwicklung halt). Geht das auch noch, wenn die Funktionen nicht static sind?

Eine Funktionsdefinition hat eine feste Adresse, ob die nun static deklariert ist, oder nicht.

Zu deinem konkreten Fall: wenn eine Variablen gleichen Namens in zwei verschiedenen C-Dot-Files static deklariert ist, dann sollte es mich doch sehr wundern, wenn damit die Selbe gemeint ist.
Bei den Funktionen: wenn der Prototyp in einem Header-File static deklariert ist, und dieser Header in verschiedenen (mehr als einem) C-Dot-File includet ist, dann liegt da wohl ein Fehler vor.
static und dann Modulübergreifend ist ein Widerspruch.

7.e.Q
09-11-2004, 10:34
Okay, das hab ich mittlerweile auch verstanden. Aber dann frage ich mich, warum das so im alten Treiber funktioniert hat und im neuen Treiber nicht mehr. Da wurde die Variable in der C-Datei als static deklariert, in der H-Datei stand sie als extern ohne static drin und beim Zugriff darauf waren's wieder zwei verschiedene. Darum hat das Entfernen des static auch geholfen, an der Stelle. An anderen Stellen hilft das auch, weil es jede der Funktionen im gesamten Treiber nur ein Mal geben soll. Guter Programmier-Stil hin oder her. Ich wurschtle mich hier durch einen Haufen von Spaghetti-Sourcen, die ich einzig und allein zum Laufen kriegen will. Mein Stil ist das ohnehin nicht, da ich den Treiber nicht entwickelt habe. Leider werden mir nicht die Resourcen zur Verfügung gestellt, den Treiber neu zu entwickeln. Dann würde das ganz anders aussehen. So bleibt mir keine Wahl, die Innereien zu übernehmen.