Forum: Mikrocontroller und Digitale Elektronik Inline Funktionen und in ihnen deklarierte variablen


von pppeter (Gast)


Lesenswert?

Ich glaube ich habe den sinn von inline Funktionen nicht so ganz 
verstanden, ich habe gedacht sie kann man so verwenden wie ein 
mehrzeiliges Makro. kleines Beispiel:

Ich will mit einer inline funktion in IAR EWB bestimmte lokale variablen 
erzeugen erzeugen und später außerhalb der IF auswerten (Die IF wird 
innerhalb einer Statemachine aufgerufen und dient nur der besseren 
lesbarkeit)
1
#pragma inline
2
void IF_getInfo(void)
3
{
4
    uint8 u8_A = *( gpu8_Daten + IRGEND_EIN_DEFINE );
5
    uint8 u8_B = *( gpu8_Daten + IRGEND_EIN_DEFINE ) + IRGENDWAS;
6
    uint8 u8_C;
7
    if( IRGENDWAS )
8
    {
9
        u8_C = *( IRGENDWAS / IRGENDWAS);
10
    }
11
    else
12
    {
13
        u8_C = *( IRGENDWAS - IRGENDWAS);
14
    }
15
}

wenn ich jetzt irgendwo in meiner Statemachine folgendes schreibe
1
IF_getInfo();
2
if ( u8_B == 0x12u )
3
{
4
    ...
meckert mein compiler einmal das u8_B deklariert aber nicht verwendet 
wird un einmal das u8_B undefiniert ist.

mit einem mehrzeiligen makro hat es funktioniert aber elegant ist das 
nicht gerade und lässt sich auch nicht so gut erstellen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

pppeter schrieb:
> Ich glaube ich habe den sinn von inline Funktionen nicht so ganz
> verstanden, ich habe gedacht sie kann man so verwenden wie ein
> mehrzeiliges Makro. kleines Beispiel:

Nein. Inline-Funktionen funktionieren für Dich als Programmierer wie 
normale Funktionen auch - nicht wie Makros.

Das heisst: Die lokalen Variablen innerhalb der Inline-Funktion haben 
ihre Gültigkeit nur in der Funktion - egal ob inline oder nicht. Auch 
hast Du dadurch keinen automatischen Zugriff auf Variablen der 
aufrufenden Funktion. Es bleibt programmiertechnisch also alles gleich.

Für Dich als Programmierer ändert sich also nichts, der Compiler kann 
aber optimieren und den (einmalig?) verwendeten Code direkt in der 
aufrufenden Funktion unterbringen, statt eine eigene mit entsprechendem 
Stack zu bauen.

Bei Makros ist es anders: Das macht der Preprozessor. Er setzt Deinen 
Code einfach durch Textersetzung dorthin, wo Du das Makro aufrufst.

Gruß,

Frank

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.