die Regeln bezüglich "inline" soweit ich es gerade im kopf habe:
1) niemals inline alleine verwenden, da die Sichtbarkeit (im Objectfile) von Funktionen dann abhängt vom Compiler und vom Optimierungslevel.
2) static inline sagt dem Compiler (genauso wie static alleine) das diese Funktion nicht sichtbar sein soll ausserhalb des generierten Objectfiles. Damit wird diese Funktion entweder geinlined, oder als eigene Funktion generiert, die aber nicht sichtbar ist nach aussen. Nachteil ist das wenn der Compiler in mehreren Objectfiles sich entscheidet die Funktion nicht zu inlinen, die Funktion mehrfach erzeugt wird (pro objectfile bis zu einmal) und dann auch mehrfach im executable ist.
3) extern static sagt dem Compiler dass er die Funktion entweder inlinen soll, oder sie als extern betrachten soll. Wenn man es so organisiert dass in allen C-Dateien als extern inline verwendet wird und in einer einzige als normale Funktion, wird genau in einem Objectfile die Funktion sichtbar sein (immer), und in allen anderen entweder geinlined oder als externe reference.
Beispiel zu 3:
inlineit.h:#ifdef INLINEIT_C
#define INLINEIT_INLINE
#else
#define INLINEIT_INLINE extern inline
#endif
INLINEIT_INLINE foobar() {
...
}
inlineit.c:#define INLINEIT_C
#include "inlineit.h"
anotherfile.c:#include "inlineit.h"
/*use foobar here*/