Forum: Mikrocontroller und Digitale Elektronik Funktion static inline und nicht static inline


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

angenommen, ich habe eine Funktion, die zur Laufzeit nur statisch 
geinlined genutzt werden soll, da sie nur einmal im Projekt vorkommt und 
extrem häufig aufgerufen wird. Für die Modul-Tests sollte sie jedoch 
dennoch auch als normal "aufrufbare" Funktion vorhanden sein. Wie sähe 
da eine sinnvolle Namenskonvention aus?

Mein erster Gedanke:
1
static inline uint8_t foo_(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
2
{
3
    return (a^b)<<(c^(d&0x13));
4
}
5
6
7
uint8_t foo(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
8
{
9
    return foo_(a, b, c, d);
10
}

Aber ich gehe davon aus, daß der Berufs-C-Programmierer bei einem 
Unterstrich eher andere Assoziationen hat.

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Mach sie weder inline noch static und aktiviere LTO, dann wird sie 
geinlined wenn nur 1x aufgerufen.

Walter T. schrieb:
> Für die Modul-Tests sollte sie jedoch dennoch auch als
> normal "aufrufbare" Funktion vorhanden sein.

Wozu genau?

von Walter T. (nicolas)


Lesenswert?

Niklas G. schrieb:
> [...] dann wird sie
> geinlined wenn nur 1x aufgerufen.

Sie wird nicht 1x aufgerufen. Sie wird 15x aufgerufen. Bei einem dieser 
15 Aufrufe, dem Wichtigsten, soll sie aber definitiv geinlined werden, 
weil dieser in einer häufig aufgerufenen ISR stattfindet. Da es sich 
aber (bis auf das Inlining) um die gleiche Funktion handelt, sollte der 
Name zusammenpassen.

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Walter T. schrieb:
> angenommen, ich habe eine Funktion, die zur Laufzeit nur statisch
> geinlined genutzt werden soll, da sie nur einmal im Projekt vorkommt

Diese Begründung ist Unsinn. Jede (normale) Funktion darf nur einmal 
in einem Projekt vorkommen. Funktionen mit dem Attribut static dürfen 
einmal pro Übersetzungseinheit vorkommen.

> und extrem häufig aufgerufen wird.

Das spricht eigentlich gegen das Inlinen.

> Für die Modul-Tests sollte sie jedoch
> dennoch auch als normal "aufrufbare" Funktion vorhanden sein. Wie sähe
> da eine sinnvolle Namenskonvention aus?

Lesen: https://gcc.gnu.org/onlinedocs/gcc/Inline.html

Falls dein Compiler nicht gcc ist, dann lies das Handbuch dieses 
Compilers.


Walter T. schrieb:
> Sie wird nicht 1x aufgerufen. Sie wird 15x aufgerufen. Bei einem dieser
> 15 Aufrufe, dem Wichtigsten, soll sie aber definitiv geinlined werden

Das geht nicht. Das Schlüsselwort inline ist nur ein Hinweis an den 
Compiler, daß er diese Funktion inlinen darf bzw. sollte. Der Compiler 
darf aber eine solcherart gekennzeichnete Funktion auch nicht inlinen 
oder andererseits eine nicht so gekennzeichnete Funktion doch inlinen. 
So lange, wie dabei das (vom Standard garantierte) Verhalten des 
Programms gleich bleibt.

Es gibt compilerspezifische Möglichkeiten, das Inlinen von Funktionen zu 
erzwingen, z.B. __attribute__((always_inline)) für gcc. Das bezieht sich 
dann aber auf jegliche Verwendung der Funktion.

von Walter T. (nicolas)


Lesenswert?

Dann sind es halt zwei Funktionen, die komplett identisch sind, bis 
auf dass die eine das Attribut static inline 
__attribute__((always_inline)) hat. Oben wurde doch schon das Beispiel 
gezeigt. Die Frage ist doch lediglich, wie ein sinnvolles Namensschema 
aussieht.

Ich weiß nicht, ob die obenstehende Fragestellung so unverständlich ist, 
oder ob sie mit Absicht falsch verstanden wird.

von Einer K. (Gast)


Lesenswert?

Walter T. schrieb:
> Ich weiß nicht, ob die obenstehende Fragestellung so unverständlich ist,
> oder ob sie mit Absicht falsch verstanden wird.

Oder, deine Anforderung ist laut C Standard unerfüllbar.
Denn ein Funktionsbezeichner muss in einer Übersetzungseinheit eindeutig 
sein.
Und wenn dir dein Unterstrich reicht... dann ist es doch gut.

Teilst du auf 2 Übersetzungseinheiten auf, dann dürfte das machbar sein.
Dann kannst du jeder Einheit eine eigene Funktion verpassen.
Auch mit gleichem Bezeichner.

von Oliver S. (oliverso)


Lesenswert?

Walter T. schrieb:
> Für die Modul-Tests sollte sie jedoch
> dennoch auch als normal "aufrufbare" Funktion vorhanden sein.

Warum? Sollen die Modultests die doch auch inlinen, an der 
Funktionalität ändert das nichts. Du weißt ja nichtmal, ob der Compiler 
das nicht sowieso macht.

Oliver

von 900ss (900ss)


Lesenswert?

Oliver S. schrieb:
> Warum? Sollen die Modultests die doch auch inlinen, an der
> Funktionalität ändert das nichts. Du weißt ja nichtmal, ob der Compiler
> das nicht sowieso macht.

Die Modultests liegen sicher nicht im gleichen Modul. Deshalb möchte er 
einen Wrapper, der global sichtbar ist, um die static (geinlinete) 
Funktion testen zu können.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

900ss D. schrieb:
> möchte er
> einen Wrapper, der global sichtbar ist, um die static (geinlinete)
> Funktion testen zu können.

Ja, das klingt genau nach dem, was ich meine.

Gibt es irgendwelche üblichen Namenskonventionen für wrapper-Funktionen 
oder gewrappte Funktionen?

von Nico W. (nico_w)


Lesenswert?

Ich würde hier wahrscheinlich mit einem define für das static inline 
arbeiten und beim Modultest mit einem leeren define ersetzen.


So testet man direkt die Funktion und nicht den Wrapper.

von Oliver S. (oliverso)


Lesenswert?

900ss D. schrieb:
> Die Modultests liegen sicher nicht im gleichen Modul. Deshalb möchte er

die Funktion in einen Header packen?

Oliver

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.