[Playlisten] [Impressum und Datenschutzerklärung]

04B.2 extern; zwei Verwendungen von static; Linker-Fehlermeldungen


CC-BY-NC-SA 3.0

Tempo:

Anklickbares Transkript:

letztesMalhatte hier was vorgeführt ein Programm in drei Teilenin drei Modulen sozusagenein Modulin Anführungszeichendas für dieSteuerung einer Heizung zum Beispiel später verantwortlich sein ganzes ein und ausschalten genau gesagtund hier ein Modul in Anführungszeichenwasmit dem Auto müssen zuständig sein kann Komma dass seine Metall Linden funktioniertundhier als drittesdie Hauptfunktionoder die Datei mit der HauptfunktionPunkt zehnmit der Hauptfunktionmähen darinamVorsitz ohne billige Artder Naturregelunggabder Gedanke war diese Modularisierungist erstens dass man Sachen wieder verwenden kanndiese Zieldatei wenn sie dann lieber mal aus buchstabiertesund die dazugehörige Header-Dateikann ich später in anderen Projekten verwendengenauso jetzt Meßsungsangelegenheitkann auch anderswo weiterverwendenich schreibe dir einmal ich teste diedann läuft sie hoffentlichunddas ganze recycelndass es ein wirklicher Vorteil war diese Modularisierungin verschiedene Dateien das ganze wird obendrein schneller kompiliertsolange ich Heizung C und Heizung H nicht anfassemuss der Compiler das auch nicht mehr anfassen müssen erledigtdas Licht als Objektkotauf der Platteähmmuss im Zweifelsfall noch die Mengdatei anfassenwar nicht darin hauptsächlich den Programmierer wenn ich die anderen beiden einfach nur recycelt diesen ja schon fertig und dann auch fertig übersetztund ?? für das ganze leichter zu verstehennoch ein Grund?? Fusion habe die was sinnvolles tut mich aber nur zwei Zahlen addierendurcheinander teilen sondern die wirklich schon echt Arbeit machen auf hohem Niveauist also vielleicht dazu verstehen kann sich hiereine Schleife eine Endlosschleife offensichtlichsofort ablesen können aber die Debatte zu niedrig ist dann damit also kein und so weiter das liest sich fast wie normale Sprachenoch ein Vorteil der so zu machendann eine Sache hatte ich letztes Mal nicht zu Endewirklichdas war nämlich bei derTemperaturmessungwie man Variablen verstecken kann ??in Camwenn ich hier irgendwelche interne habe in dieser Datei TemperaturmessungC von der sonst keiner erfahren sollmit dem keiner rein forschen sollmuss ich bisschen vorsichtig sein Cman könnte hier sowas versuchenglobale Variable anzulegenins Maximaltemperaturund die dann über Sätze Maximaltemperaturauch tatsächlich zu setzen und sichert dannwenn jemand diese Funktion aufruftmit den tatsächlich ?? war ja Maximaltemperaturauf den übergebenen Wert gesetzt und ich werde dannim folgenden danndiese Variable verwendendas sieht soweit harmlos aus der Ärger ist wenn das so machen ist dies variabel auch außerhalb dieser Detailssichtbarwenn man denn willdas merkt man am einfachsten man versucht sie noch mal anzulegenZimmern drauf kommt auch in verminderter Komma Schisma aufsich immer drauf kommt in der Maildatei auch lassen Variable anzulegenweiler nicht weißwas sie in derDebatte um Messung Datei machen?? Project MacersehenSie hier number FlowerswarenZimmertemperaturwie die Feinddas ist einÄrgernis an der Stelle alsowenn sie so eine Variable haben die jetzt von Nierenfunktionbenutzt werden sollda drinnender ?? das erst malnicht unsinnig das so anzulegen dass man sagt okay alle Funktionen in dieser Datei können Sie auf diese Maximaltemperaturzugreifender Ärger ist wenn Sie das so machen können nicht nur diese Funktion darin zugreifenes kann auch jederandere darauf zugreifen insbesondere jetzt in der Maine Dateisind sie das Ärgerbesser Compiler sagt mir die Hammer schonjetzt auf zwei Arten weitermachenman könnte sagen in dieser Datei hierbenutze doch die eine Variable die anderswo definiert es dann schreiben Sie Ihren extern davorauf diese Weiseohne dass sie einen Wert zuweisen mit externervorsang sie die Variable lebt irgendwo andersich weiß nicht wowerden schon herausfindendann kann der Compiler damit arbeitensie zum BeispielAusnahme ihr Kindin und wargleichMaximaltemperaturdes Ganges gerade mal anguckenwas dann passieren wirdsiesind interessiert mich nicht ich hätte gernehätte gerne hätte gerne diesRexsodasteht sie sehen schonunsere Maximaltemperaturbisschen mehr PlatzBeistrich also Maximaltemperaturwenn ich jetzt rein gehein die Hauptfunktionalsodann gucken was A geworden Entschuldigung JohnLockesind ja da auf zwoundvierzig gesetztdas in dieser Dateimeint Punkt zehnYen zugesagt dass maximal Temperatur zwoundvierzig istdu gesagtirgendwo andersirgendwann der Silber Compiler wird diese Variable geben verlass dich draufdann kann ich die verwenden das Wasser mit diesem externeine externe Variable in einer Datei extern zu dieserDateiinsofern glaube ich relativ einfach zu merken extern heißtwoanders definiert in eine Datei und dann könnte die so verwendenals ob sie die selbst verwendete als ob sie selbst eingeführt habenPunkt das ist allerdings eher dieunschöne Varianteamich würde lieber dafür sorgen dass Variablen sich irgendwo einführe anderswoverborgensind das Gegenteilvon diesemexternen?? ist absurderweisestatischwenn sie jetzt der Tag davor schreibendas sollte eigentlichintern heißenin einigen Sprachen danach Heise dann sicherlich intern aber leider hat siemit dem Unsinn angefangen?? Ästhetikzu benennen an dieser Stelleaber mir ist hätte ich das bestätigt das Gegenteil von externander das Gegenstückdas Gegenteil das Gegenstück dazu mit static sagen Sie diese Variable hier bleibt verborgen in dieser Datei und sonst weiß keiner was davonwenn ich das erste Mal nehmeund den machedas eben ja Ärger gabzu Beginn ohne dass der Tag gab sie ihr den Ärger des Zimmertemperaturaber schonimmer MacLinde gibt es keinen Ärger mehrdiese Variable hier nach der Temperaturmessungzehndiese hier ist jetztverborgenhatte schon nervte das ist nicht verwendet wird Komma was ihrzweite Motto ist gesetzt aber niemals benutzt worden eine Warnunganbeide müssen schwachsinniges Gesetz auch sein vierzig aber ich benutze sie niemals aus es kein Fehlerals Ästhetik an der Stelle heißt verbergenin dieser Datei verbergendass das was man üblicherweise sehen wirdannbald im Hinterkopfwenn sie das sehen Tätigkeit einigten ihr sowas wie interndas Gegenstück zu externnicht zu sagen wo anders ist diese Variante definiert sondern hier sage ich in dieser Dateiist die Variable definiert und nirgendwo sonstkönnte woanders auch noch mal definiert seine sind sie jawahrscheinlich auch sinnvollerweise bestätigt der Vorsteherdes ?? zwei Variablen desselben Namensdas vorführenVariante desselben Namensdamit der Compiler tatsächlich Manns Variable an dich Punkt sie verwenden auch wenn die Optimierung aus istanscheinendgemein?? ich verwende sie da mal diese eine Variable aus der DateimensSie und die andere Weise Temperaturmessungzieht die andere?? wird ihr verwendet insofern aber sollte diesen Zustand mal aufrufen dass er das in Aktion sehenzwanzigsieben ??so jetztsosind sie zweimal die diese Variablehatsodie Variable mit dem selben Namen ob es existiert in zwei verschiedenen Stellen einmal inMaineund einmal in Temperaturmessungmithilfe von dem statichat das tatsächlich möglich Varianten desselben Namens zu habendiean verschiedenen Stellen leben je gibt's die eine die lebt in sammeln Zederteilmit seti Kindund es in die anderewardie Liebs sättigtin dieser anderen Datei und die beiden haben nichts miteinander zu tun auch wenn sie denselben Namen haben?? tatsächlich möglich das auf diese Weise zu Kapseln ist der professionell heißtdanndiese Variable hier ist für alle anderen Leute versteckt wenn sie solchemodularen Programme schreibenist es Gutes ist es eine gute Idee dass die Variablen die sie so anlegen innerhalb der Datei globale Variablen innerhalb der Dateidass sie diemit der Tag zumindest vor allen anderen Dateien versteckendasist die zweiteBedeutung von static was war die erste Bedeutung von staticTat ja die andere Leute von Ästhetik war ein Variable die stehenbleibt oder gucken wollte sie malführtemacht es nicht viel Sinnsowas hierdas dümmste Beispiel was ziemlich zwecklos ist aberähm zumindest so funktioniert würdest immer ich stelle zum Beispiel mit vier häufig eine Pension aufgerufen wird seti Kind sollte ?? dazu schreiben moderner Vasenamwenn dies ohne static an dieser Stelle schreiben haben sie lokal eine Variableähm in der Funktion angelegt die jedes Mal bei jedem Aufruf auf eins gesetzt wird und darauf zwei hoch gezählt wird tollwenn sie das Wetter vorschreibenkann sie Variable angelegt die stehen bleibtdie beimAnfang des Programms auf eins gesetzt wird ?? gemerkt am Anfang des Programmsnicht an dieser Stelle soll Mama Anfang des Programms auf eins gesetzt wirdund dannbei jedem Aufruf von der Funktion als vorgestelltdas heißt damit kann ich tatsächlich zählenjeden Aufruf nutze zum Beispiel ich könnte mir auch in dieser Funktion intern was merke noch was habe ichirgendwelche Ausgang gestellt beim letzten Mal und Ähnliches das wären sie voller Anwendung als hierzu zähleneher das die beiden Arten wie static vorkommteinmal innerhalb von Funktioneneine Variable die stehen bleibt für den nächsten Aufruf und den übernächsten und so weiterund die Zeit dahinter wird eben nur ein einziges Mal Programmstart ausgeführt?? nicht irritieren lassen ?? macht mich bei jedem Mal dann sind das einzelne nur einmal zu Programmstartsieht etwasüberraschend ausVariante eins von static und Variante zwei von static ist dieses hier eine Variableanlegen aber in der Datei versteckendie das außer von Funktionen machendieses andere ihr was ich ?? ihm erzählt habe sollte man eigentlich internenhat sich alles durch nicht so ergebendannmuss man jetzt mit Leben Ästhetik so bisschen schrägin dieser Variante hier isttechnisch ist das sehr ähnlichaber von der denke Herr sind diese beiden Sachen doch sehr verschiedeneinmal eine Variable die stehen bleibt von Funktionsaufrufzu Funktionsaufrufund einmal eine Variable die verstecktist in der Datei versteckt ist das ein anderer damitirgendwelchen Unsinn anstellen kanndaswollte ich noch erwähnt haben zu dem staticwelche der Variablen giltgerade oder welche der Variablen angesprochen wirdentscheidet sich eben der dadurchwelche Datei ich bin an hierbin ich in der Datei mit der Ticket maximal hundert und zweiundvierzigdas heißt diese Maximaltemperatursprichtdiese Variable an und keine andereund in derMaildatei hierdiese hierspricht diese Variable an und keine andereda kann er nichts schief gehen an der Stelle also es gilt immer die jeweiligeFertigkindoder static sowieso heißtdiese Variable ist in dieser Datei dasichtbar verfügbarverwendbarund ist für alle anderen Dateienverborgendas heißt automatischdass diese Variable nicht diejenige sein kanndie hier angesprochen wirddas jetztnächstes Semester mit Objekte der Programmierung noch in bisschenhübscher muss ich sagen hübscher und klarer mit der Kapselungda hat manwenigerdann solche Module wie hier weit objektorientierteProgrammierung kann man auch machen ?? man es bei Klassen vereinigendannsein das hier ist einAuto das hier ist einersowieso Maschine das hier ist eine Datenbank oder was auch immerKlassen diein sich abgeschlossen sind in den man Sachen verstecken kann?? mit Oldenburger ?? gibt es auch static um sie total zu verwirrenund das ist ?? eine dritte Bedeutungsverlusttotal fiesist was fertiges leider etwasüberbelegtin den üblichen Programmiersprachenals sicher statisch innerhalb der Funktion das fand ich noch immer sinnvoll eigentlichalle selbst gelernt habe die Variable bleibt stehendie wirklich dynamisch angelegte Variable bleibt stehen Staat ist statisch bis zum nächsten Aufruf dazu steht hier statischist schonkomisch das sollte lieber intern heißenvolles Gegenstück zu Statik an der Stelle externesUni sollte aber sein das im basierten Funktionähmkönnen statische Funktionen haben und externenFunktionsdeklarationenhabendasselbe Spiel hier mit Variablenstatischoder nicht geht dann auch mit Funktionenrechtliche zum Beispielhabe diese Funktion hierund würde die versuchen anderswo neu zu bauenguckennehme hier in NN innahezu zehnnicht auf den Gedanken käme das sich in Heizung C auch nochmals ohne Funktion haben wollen würdedas an protect Megsehen Siehiersetze Maximaltemperaturwie die Feind in ModulmodulTemperaturmessungwelchen Teil der Kompilierung und ein diese FehlermeldungPräprozessorCompiler linkerder Linker wird das am Ende merkenjede Datei die zuerst durch denPräprozessordurch großes mit nähen ander Präprozessorlöst hier diese Doppelkreuz sonst wieder aufund baut hier das mag wirkliche Dateien reinbedenkliche Designsauflösenund ähnliche Geschichten das Wasser Präprozessordann geht's in den Compiler der diese einzelne Zieldatei nimmt diese dreizehn Dateien hier stehendie Linie der dienendbesetzten Objekt bot jede für sichbis dahin hat niemand gemerkt dass diese Funktion hier setze maximal Temperatur zweimal vorkommt in meinem Programmsieht es der Linkerdenn die Objektdateinimmt also was sie aus diesen drei Zähler deinen Standpunktder linken in die Objektplatanebaut zusammen und erst der merktdas zweimal dieselbe Funktionistdas erste Meldung von Linkeram Vormittag??hat sich hier diese noch diese Funktion innerhalb der Zieldatei der Mottomessung stört keinwas den Präprozessor angeht und was den Compiler angeht das wird nett übersetztes der Linker stellt festdass es im gesamten Programm zwei Funktionsnamenssetze maximal ??gibtunddeshalb sachliche ?? gibtdas gibt Ärger erlaubt weil man im WinterKompilierung hat funktioniertzum CeBIT kompiliert und so weiter alles wird nett kompiliertalso StammesLinkedInjetzt kommt der Linker der versucht das zusammenzubringenwas aus diesen drei Dateien entstanden istund der Linker fällt auf die Nase weil diese Funktion zweimal daandasselbe was ich hier vorgeführt hat mit der variablennamensmaximal der Natur oder wie sie hießan das sie was ihr vorgeführt ?? Gitternärgerlicherweiseauch normal für Funktionenfunktionsind dann auch nicht ordentlich verborgenKönnenSie sagen es gibt eine Hierarchie an der Stelle wenn sich hier eine Variable ohne allesinsParadies sieht jederkann jeder See soll es handelt sichdies kann jeder sicham dann ist dasquasi auf der höchsten Stufe da kann jeder im Programm drauf zugreifenauf diese Variable hierauf diese Variable kann nur drauf zugreifen was in dieser speziellen Seedatei passiertdiese hierist der Dichter vorschreibenund aufdiese Variable hier zum Beispielinnerhalb einer Funktionkann nur zugreifenwas in dieser Funktion passiert nach dem die Variable eingeführt worden ist ?? insofern sind das tatsächlich der drei Hierarchiestufenwenn sie wollensehr gute Frage wozu brauchen sie extern dann weil der C-Compilerso blöd istwird diese Variable verwenden wollen in der anderen Datei seiner in Mainz sehenwas wird nunpassieren wenn ich versuche das zu übersetzender Compiler wird sagen kenne ich nicht der Compilerstattdessen von den PräprozessorgasseninduziertenschönUnterstützer da drauf und kennt es nichtdas Ding ist eben blödKlammer auf herauseine letzte WarnungPunktgucke ihr erwarb Jennifer dies kann jeder Sinn ist an die Feindder Compiler läuft auf diese Zeitung sieht es nichtähmwas muss ich tun damit das trotzdem gehtgenau jetzt das extern jetzt sagen Sie aha lieber Compiler übrigensübrigens lieber Compiler irgendwo gibt es eine Hintvariable die heißt dies kann jeder sehenund dann ist der Compiler glücklich ?? Komma Protect Macnull Fehlergenau diesen richtig global globale Variable haben willmuss ich sie als extern definierte Muster in jeder Zieldateials extern definiert sein das ist der Ärgerin der ?? wenn ich sie jetzt hier verwenden will zum Beispielin den Inhalts um zehn nach der Heizung zehnmuss sie auch hier jawieder drin stehen alsexternblablablasonst gibt's da schon wieder was auf die Finger in jeder Zieldateiin der ??wieder dieserichtig globale Variable verwendet werden sollin jeder dieser Cedateien muss sie Ex extern drin sein was man typischerweisemachen wird ist das man es nicht hierhin schreibt das mit dem externweichen Idee wurde das hinschreiben werden sinnvollerweiseja also der Gedanke ist natürlich das herauszunehmenund das in die Header-Datei reinzusetzendamit typischerweise der StentemperaturmessungHaarda sind sich die Sting hereinund jeder der jetzt diese Header-Datei inkludiertkann automatisch diese Variable verwenden so wird es dann typischerweiseausder minderteinkludieren sich die Portomessung HaartemperaturmessungHaar steht drinnen es gibt externe Variablennamensdies kann jeder sehenkann die hier verwendet werden ?? ProjectMacEinführung ganz viele unbenutzte Variablen aber kein Fehler mehr das Musik ?? Nummerzeichen das wäre die typische Art das zu machendem Header von der Temperaturmessungstehtlieber Compilerirgendwo wird an eine Variablein Thatcher angelegtund dies kann jeder sehen??vertraue mir ??und jede Zeder teile jetzt diese Header-Dateinutzt insbesondere hiermeint sieeine Zieldatei die diese Header-Datei benutzt kann jetzt diese Variablen nutzendies kann jeder sehen dass wir die übliche Lösung seindas es haarsträubendhistorischer Kram stand ?? dafür das es halt so gewachsenweil der Compiler erst mal oder weil die Compilervor X Jahrzehnten eben bisschen dümmer waren als sie Komma noch heutedas globale von allen ist schon dieses hier dass sie eine Variableaußerhalb einer Funktion anlegenund dannin der Header-Datei sagen externanjede Zieldateidie diese Variable verwenden will braucht nirgendwodiese Deklarationmit dem extern der Vorsatz kann es nicht funktionierensie können es nicht ohne das externe verwenden bei der Compiler sind auf die Nase fälltnochmal die Fehlermeldung die entsteht wenn ich eine Funktionmehrfach drin habe weil die sieht sehr verwirrend ausväterliche die Funktionder Zimmer Zimmertemperaturzweimal drin ich hab sie einmal in TemperaturmessungC drin und ich hab sie einmal Heizung zehn Rennenwas der Compilerder Linker genauer gesagtnicht mögen wird und dann gibt's ebendarüber ?? Running Linker und eine total absurde Fehlermeldungentweder zu Maximaltemperaturin Modulheizungwie die Feind in Modul Temperaturmessungdannendlich ein Tabelleneintragwas der Linker macht der Bau der Tabelle auf alle Symbole setze MaximaltemperaturstelleHeizung ausdie Namen meinerVariablenzu weitergestellte Linker in einer Tabelle zusammenund die Tabelle ?? Einträgeentryund der Eintrag sitzt Maximaltemperaturistwie die Vereins erneut definiert es gibt diesen Eintragmehrfach daswill er mir damit sagen der Rest ist hoffentlich nicht so unklar ein Fehler im siebenundzwanzigster?? imCompilerherstellerdiesen Fehler genannt der Eintrag setzte Maximaltemperaturim Modul Heizung gesteht Komma derNameähm der ObjektdateiR dreiundvierzigtotal schräg heißen hier die Objektdateienschon übersetzten sie Lateinin dieser Objektdateisind die wackerenObjektobjektprobiertdannistjetzt Maximaltemperaturtrennen und das ist wie die Feind erneut definiert im Modul Temperaturmessungund ist dann dieses Debugger Objekt die Objektdatei die außer dem Motto Messung geworden istbaut insgesamt der Linker baut insgesamt eine Tabelle zusammenmit allen Funktionsnamenund Variablennamenund so weitererdir dann noch zusammen basteln muss Tickets in den Ärger dass derselbe Eintrag mehrfach vorkommt dass wir uns damit gesagt haben