Marc L. schrieb:
> Hallo,
>
> ich habe ein paar Fragen zum Prototypisieren von Funktionen mit static
> inline und nur inline.
> Alle Prototypen habe ich in der dazugehörigen .h-Datei.
>
> Ich verwende u.a. die KS0108-Lib von Ape.
> Dort wird im Original folgende Funktion prototypisiert:
>
1 | > inline uint8_t ks0108ReadData(void);
|
2 | >
|
> Das ergibt folgende Warnung:
> [code]
> warning: inline function 'ks0108ReadData' declared but never defined
Weißt du was inline macht?
Es fordert den Compiler auf, den Funktionsinhalt an der Stelle de
Aufrufes einzusetzen. Anstelle eines Funktionsaufrufes wird dort also
der Funktionskörper eingebaut.
Das machen wir beide mal
1 | inline uint8_t foo( void );
|
2 |
|
3 |
|
4 | int main()
|
5 | {
|
6 | int i = 5;
|
7 |
|
8 | foo();
|
9 | }
|
also: welcher Code ergibt sich, wenn du den Funktionsaufruf durch den
Körper der Funktion foo ersetzt?
Wie, das kannst du nicht, weil du ja nicht weißt, was alles in der
Funktion foo gemacht wird?
Genau das verlangst du aber von deinem Compiler! Wenn du das nicht
kannst, wie soll es dann der Compiler können?
Und so
1 | inline uint8_t foo( void )
|
2 | {
|
3 | int j = 5;
|
4 | int k = 2 * j;
|
5 | }
|
6 |
|
7 |
|
8 | int main()
|
9 | {
|
10 | int i = 5;
|
11 |
|
12 | foo();
|
13 | }
|
können sowohl du als auch der Compiler die Funktion inlinen. Hier ist
die Funktion tatsächlich definiert und nicht nur deklariert, also
vereinbart dass es eine Funktion dieses Namens gibt
Heraus kommt:
1 | int main()
|
2 | {
|
3 | int i = 5;
|
4 |
|
5 | {
|
6 | int j = 5;
|
7 | int k = 2 * j;
|
8 | }
|
9 | }
|
Der Funktionskörper der Funktion foo wurde an der Aufrufstelle eingebaut
>
1 | > static inline uint16_t key_scan(void);
|
2 | >
|
> Das ergibt folgende Warnung:
> [code]
> warning: 'key_scan' declared 'static' but never defined
declared but never defined. Genau das gleiche Symptom
> Wenn ich nur
>
1 | > uint16_t key_scan(void);
|
2 | >
|
> schreibe, kommt folgende Fehlermeldung:
> [code]
> error: static declaration of 'key_scan' follows non-static declaration
Du hast 2 Protoypen. Einmal einen mit static und einmal einen ohne
static.
> Kommentiere ich
>
1 | > static inline uint16_t key_scan(void);
|
2 | >
|
> vollständig aus, so bekomme ich keinen Fehler und keine Warnung mehr.
> Das Programm arbeitet so ohne Probleme.
>
> Was ich nun wissen möchte:
> Muss man static inline bzw. nur inline prototypisieren?
> Wenn ja, wie bekommt man das ohne Fehler- und Warnmeldungen hin?
Indem man darüber nachdenkt was static bzw in line eigentlich machen
(gegebenenfalls im Lehrbuch nachschlagen) und das Gelesene dann in die
Praxis umsetzen.
>
> Danke,
> Marc