static Variable in C Funktion

OP Persönliche Seite #1245423
Hi,

folgendes "Problem":

Ich habe eine Funktion innerhalb einer C-Datei die mit statischen 
Variablen arbeitet (static). Der Compiler/Linker (ICCAVR von Imagecraft) 
reserviert jetzt für diese statischen Variablen Speicher (im Mapfile 
angegeben) (soweit logisch da das static ihn ja dazu anweist die 
Variable zu Programmbeginn zu initialisieren).
Mich ärgert daran, dass er dies tut obwohl die Funktion im Programm 
nicht aufgerufen wird.

Ist das compilerseitig abschaltbar, so dass die statischen Variablen aus 
Funktionen die nicht aufgerufen werden auch nicht im RAM vorgesehen 
werden? Oder ist das durch einen C-Standard so vorgeschrieben und bei 
Verwendung von static dann halt einfach so?

Wie könnte man dieses Problem progammiertechnisch besser meistern?
Dazu könnte ich diese Variablen über Parameter realisieren die ich dann 
ja nur anlegen brauche wenn die Funktion benötigt wird was ich vermeiden 
möchte.
Was fällt euch dazu ein?

Bitte unterbreitet mir jetzt nicht den Vorschlag einfach die eh 
unbenutzte Funktion aus der Datei zu entfernen, denn dann wäre die 
inkludierte Datei ja wieder abhängig vom Projekt und das ist ungewünscht 
;-)


Danke, MfG
Robert
Gast
Also bei der GCC kann man das einstellen. Dann werden unbenutzte 
Routinen rausgeworfen, einschließlich der Variablen... theoretisch 
zumindest, d.h., wenn da kein Bug ist :-)

Sonst kommts wie immer drauf an. Natürlich kannste beim Aufruf nen 
Zeiger mitgeben. Muss es überhaupt statisch sein...?
Persönliche Seite
Du könntest die statische Variable durch einen Pointer ersetzen, der mit 
0 initialisiert wird, und beim 1. Aufrufen wird mit malloc Speicher 
angefordert und der Pointer darauf gesetzt.
Du könntest aber auch mit #define's arbeiten:
1
#ifdef INCLUDE_MY_FUNCTION
2
void my_function () {
3
  static char my_var [500];
4
}
5
#endif
Wenn du die Funktion dann haben willst, kannst du den Compiler mit 
"-DINCLUDE_MY_FUNCTION" aufrufen.
Oder du lagerst die Funktion in eine eigene Datei aus, die nur dann 
mit-gelinkt wird, wenn man die Funktion haben will.
OP Persönliche Seite
Danke für die Vorschläge.

Sven P. wrote:
> Sonst kommts wie immer drauf an. Natürlich kannste beim Aufruf nen
> Zeiger mitgeben. Muss es überhaupt statisch sein...?

Jop, ich denke schon das es statisch sein muss. Brauch gewisse Werte 
beim Wiedereintritt in die Funktion.
Wenn der GCC das kann muss ich mal daheim schauen ob ich die Einstellung 
finde, klingt erstmal positiv.

@ Niklas G.
Das mit dem Zeiger klingt interessant, dem geh ich mal genauer nach.

Die Variante über defines wollt ich nicht verwenden, zu faul immer die 
entsprechenden Flags zu setzen :P
Aber sonst eine saubere Sache.
Extra Datei möcht ich dafür auch nicht nutzen.
Gast
Es ist Aufgabe des LINKERS, nicht benutze Funktionen und Variablen zu 
erkennen und evtl. wegzulassen.
Also die Linker Optionen hierzu durchsehen.
Der Fachbegriff hierzu nennt sich "deadstripping" oder "dead stripping".
Gast
Hallo,

es stellt sich die Frage: Wieso gibt es innerhalb eines Moduln (c file) 
Funktionen die nicht aufgerufen werden?

So etwas lagert man aus. Also eigene Moduln, die nur bei Bedarf dem 
Projekt zugefügt und damit gelinkt werden. Oder man fasst solche 
Funktionen in einer Library zusammen und erhält so den gewünschten 
Automatismus. Zur Not hilft auch bedingte Compilierung.
Diese Möglichkeiten sind Compiler unabhängig.

Tschü Dude
Persönliche Seite
<Pedanterie>
Das Modul. Plural: Module. (Betonung auf 'u')

ist eine Baugruppe, ein Teil von etwas

Der Modul, Plural: Moduln (Betonung auf 'o')

ist ein Teilungsverhältnis, wie es beispielsweise bei Zahnrädern 
auftritt.

</Pedanterie>

Modernere Linker können auf Funktionsebene linken, ältere linken nur auf 
Modulebene.
Das klassische Standardverhalten ist, daß alle Module, die explizit 
angegeben werden, gelinkt werden, auch, wenn diese gar nicht verwendet 
werden. Ein Linken nach Bedarf ist hier mit Libraries möglich, hier 
werden aus der Library nur die benötigten Module entnommen.
Gast
Klaus wrote:
> Es ist Aufgabe des LINKERS, nicht benutze Funktionen und Variablen zu
> erkennen und evtl. wegzulassen.

<Klugscheiß-Modus>
Nur zum Verständnis: GCC ist nicht der GNU-C-Compiler :-)
</Klugscheiß-Modus>
Wenn schon Klugscheiß-Modus, dann gleich noch mehr:

Daß die Funktion gar nicht aufgerufen wird, reicht nicht unbedingt,
um sie weglassen zu können (manuell oder automatisch durch einen
intelligenten Linker).

Steht beispielsweise ein Aufruf in einem if-Zweig, der nie ausgeführt
wird, kann die Funktion nicht weggelassen werden.
Ebenfalls wenn man sie in einem Ausdruck anspricht und dadurch
ihre Adresse bekommt.

Aus dem OP sehe ich jetzt nicht, ob nur durch den Programmfluß
kein Aufruf erfolgt, oder ob die Funktion wirklich überflüssig ist.
OP Persönliche Seite
Es handelt sich um eine Funktion die inhaltlich zum Bedienen der UART da 
ist und damit im uart.c eingeordnet wurde. Da ich aber nicht in jedem 
Projekt jede Funktion davon brauche aber sie auch nicht in ein extra 
Modul auslagern will habe ich gefragt :-)
Sie wird aber nirgends aufgerufen, lediglich im .h und .c File 
deklariert bzw. definiert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.