Hallo, ich bin grade an einem größeren Projekt beschäftigt und habe viele Software-Module. Ein Software-Modul besteht dabei aus einer C-Datei mit der dazugehörigen Header-Datei. Als Entwicklungsumgebung wird CoIDE von CooCox in der aktuellen Version 1.7.7 verwendet. Nun zum Problem: Beim Programmieren werden mir zu viele Einträge vorgeschlagen, die jedoch nicht sichtbar sein sollten. Mein Ziel ist eine Beeinflussung der Sichbarkeit von Funktionen in anderen Programmteilen. Deshalb sind Funktionen (bzw. deren Prototypen), die nicht global sichtbar sein sollen, nicht in den Header-Dateien der entsprechenden Module implementiert sondern in den dazugehörigen C-Dateien. Zur Erläuterung des Problems habe ich ein Test-Projekt angelegt (siehe Anhang "CooCox_Test.zip"), in dem nur ein Modul verwendet wird. Der prinzipielle Aufbau des Test-Projekts mit den Funktionen ist im "Bild_1.png" im Anhang dargestellt. "testfunktion3()" wurde hervorgehoben, denn wenn diese von "main" aus aufgerufen wird, gibt es eine Compiler-Warnung mit dem Hinweis "implicit declaration of function 'testfunktion3'". Diese Warnung ist völlig korrekt und auch erwünscht. Die Frage ist, warum CoIDE mir die "testfunktion3()" beim Programmieren in "main" vorschlägt (siehe "Bild-2.png")? Diese sollte in der Vorschlagsliste nicht erscheinen. Dies ist störend und fehlerträchtig. Ich habe das gleiche Test-Projekt in Atmel Studio (Version 6.1) erstellt. Dort wird die "testfunktion3()" nicht vorgeschlagen. So sollte dies auch in CoIDE sein. Hat jemand eine Lösung bzw. eine Idee, wie man die Liste der vorgeschlagenen Einträge durch eine korrekte Analyse der Header- und C-Dateien reduzieren kann? In den Einstellungen habe ich nichts Passendes gefunden. Vielen Dank schonmal für die Unterstützung. Daniel
@Daniel (Gast) >anderen Programmteilen. Deshalb sind Funktionen (bzw. deren Prototypen), >die nicht global sichtbar sein sollen, nicht in den Header-Dateien der >entsprechenden Module implementiert sondern in den dazugehörigen >C-Dateien. Wer macht denn sowas? Dafür gibt es doch das Wort static. >Die Frage ist, warum CoIDE mir die "testfunktion3()" beim Programmieren >in "main" vorschlägt (siehe "Bild-2.png")? Probier mal static. >Ich habe das gleiche Test-Projekt in Atmel Studio (Version 6.1) >erstellt. Dort wird die "testfunktion3()" nicht vorgeschlagen. So sollte >dies auch in CoIDE sein. Die ist wahrscheinlich ein wenig oberschlau und ignoriert, dass dein Prototyp fehlt.
Coocox lässt dich diese Funktion auch kompilieren, allerdings kommt eine Warnung dass die Funktion nicht richtig deklariert ist. Da steht dann immer was von "Enabled by Default" vl. musst du das irgendwie deaktivieren.
@Franz F. (franzman) >Coocox lässt dich diese Funktion auch kompilieren, allerdings kommt eine >Warnung dass die Funktion nicht richtig deklariert ist. Da steht dann >immer was von "Enabled by Default" vl. musst du das irgendwie >deaktivieren. Das Problem ist ja nicht die Warnung. Ich möchte ja die Funktion in "main.c" erst garnicht aufrufen können, d.h. falls diese aufgerufen wird, sollte die Kompilierung mit einem Fehler abbrechen. @Falk Brunner (falk) >Wer macht denn sowas? Dafür gibt es doch das Wort static. "static" kannte ich bis jetzt nur im Zusammenhang mit Variablen. Das scheint jedoch die Lösung des Problems zu sein: CoIDE schlägt mir die mit "static" definierten Funktionen nicht mehr vor und es gibt einen Kompilierabbruch, wenn diese Funktion in anderen Modulen verwendet wird. Ein Modul würde ich also wie folgt aufbauen: In der Header-Datei: Alle Funktionsprototypen (und Datendeklarationen), die global sichtbar sein sollen (also im gesamten Projekt) In der dazugehörigen C-Datei: - Funktionsdefinitionen der im Header deklarierten globalen Prototypen - Lokale Funktionen, die nur in dem Modul sichtbar sein sollen (mit Schlüsselwort "static") Wäre eine solche Implementierung "richtig" oder ist es eher ungewöhnlich und nicht zu empfehlen?
@ Daniel (Gast) >"static" kannte ich bis jetzt nur im Zusammenhang mit Variablen. Static hat mehrere Bedeutungen. Ich kriag aber jetzt nicht alle zusammen. >In der Header-Datei: >Alle Funktionsprototypen (und Datendeklarationen), die global sichtbar >sein sollen (also im gesamten Projekt) >In der dazugehörigen C-Datei: >- Funktionsdefinitionen der im Header deklarierten globalen Prototypen >- Lokale Funktionen, die nur in dem Modul sichtbar sein sollen (mit >Schlüsselwort "static") Jo. >Wäre eine solche Implementierung "richtig" Ja.
Keine sonderlich umfangreiche Erklärung, aber besser als nix. https://www.mikrocontroller.net/articles/FAQ#Header_File_-_wie_geht_das http://home.fhtw-berlin.de/~junghans/cref/SYNTAX/static.htm http://stackoverflow.com/questions/558122/what-is-a-static-function google static c function
@Falk Brunner (falk) Vielen Dank für die Antworten und Hinweise. Die Bedeutungen des "static"-Schlüsselworts habe ich bereits recherchiert und das ist es, was ich gesucht habe. Durch die Verwendung von "static" für modul-interne Funktionen sind diese in anderen Programmteilen (Modulen) nicht sichtbar. Werden diese trotzdem verwendet, so wird der Kompiliervorgang mit einem entsprechenden Fehler abgebrochen. Und CoIDE schlägt mir die modul-internen Funktionen in anderen Modulen auch nicht mehr vor.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

