Forum: Mikrocontroller und Digitale Elektronik CooCox CoIDE: Autovervollständigung (Content Assist) zeigt zu viele Einträge an


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@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.

von Franz F. (franzman)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

@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?

von Falk B. (falk)


Lesenswert?

@ 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.

von Falk B. (falk)


Lesenswert?


von Daniel (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.