3 Stimmen

Wie kann ich eine Inline-Funktion in einer C99-Bibliothek verwenden, aber nicht freigeben?

Ich schreibe eine Bibliothek in C99, und es gibt einige Teile der Bibliothek, die erheblich von der Verwendung eines Makros / Inline-Funktion profitieren würde. Inline-Funktionen sind eine bessere Passform für meine Bibliothek.

Ich möchte diese Inline-Funktionen jedoch ausdrücklich nicht nach außen hin sichtbar machen.

Alles scheint zu funktionieren, aber wenn ich mit der Bibliothek verknüpfe, um eine ausführbare Datei zu erstellen, erhalte ich den Fehler: "undefined reference to `na_impl_gfx__draw'"

Ich habe das Problem in einem minimalen Testfall reproduziert, der genau das tut, was ich tue:

lib.h:

void somefunc();

lib.c:

#include <stdio.h>
#include "lib.h"

inline void someinline(char *value);

void somefunc() {
  someinline("Hi!");
}

inline void someinline(char *value) {
  printf("%s\n", value);
}

main.c:

#include "lib.h"
int main(int argc, char *argv[]) {
  somefunc();
}

Jetzt kompilieren wir:

doug@Wulf:~/test$ gcc -c -std=c99 lib.c
doug@Wulf:~/test$ gcc -c -std=c99 main.c
doug@Wulf:~/test$ gcc -std=c99 lib.o main.o
lib.o: In function `somefunc':
lib.c:(.text+0xe): undefined reference to `someinline'
lib.c:(.text+0x1a): undefined reference to `someinline'
lib.c:(.text+0x26): undefined reference to `someinline'
collect2: ld returned 1 exit status

Es scheint, dass beim Kompilieren der Bibliothek die Inline-Funktion nicht in den Objektcode für die Funktion somefunc() in lib.h eingefügt wird

Warum?

Die Inline-Funktion ist von außen nicht sichtbar. Ich würde erwarten, dass, wenn die Bibliothek kompiliert wird, die Inline-Funktion in die Funktion eingefügt wird, genau wie das Makro ist (Nb. mit nur ein Makro dieser Code kompiliert Datei).

Was mache ich falsch? Oder ist dies eine Einschränkung der Inline-Funktionen?

5voto

Lawrence Woodman Punkte 1422

Der Grund, warum Sie die Inline-Funktion nicht in derselben Quelldatei sehen können, ist, dass Sie sie nicht statisch gemacht haben.

Alles, was Sie tun müssen, ist, den Prototyp mit statisch zu machen:

inline static void someinline(char *value);

und die Funktionsdefinition statisch mit:

inline static void someinline(char *value) {
  printf("%s\n", value);
}

4voto

Jens Gustedt Punkte 74457

(Tut mir leid, dass ich mich erst jetzt einmische, Sie hätten Ihre Frage mit C und nicht nur mit C99 kennzeichnen müssen.]

Ich glaube, mit Ihrer Frage sind Sie völlig auf dem Holzweg. Inline-Funktionen machen nur Sinn, wenn man sie in eine ".h"-Datei einfügt. Bei dem ganzen Konzept geht es darum, die Funktionsdefinition für alle Aufrufer sichtbar zu machen.

Wenn Sie das tun würden, sollten Sie die Definition (mit dem inline ) im Header und eine externe Deklaration (mit extern inline ) in einer Kompilationseinheit.

Wenn Sie einfach nur Funktionen in Ihre "lib.o"-Kompiliereinheit einfügen wollen, können Sie das alles vergessen inline o static und lassen Sie den Compiler das für Sie erledigen. gcc macht das, wenn Sie die Optimierung einschalten:

Finline-kleine-Funktionen Integriert Funktionen in ihre Aufrufer, wenn ihr Körper kleiner ist als der erwartete Code für den Funktionsaufruf (so wird die Gesamtgröße des Programms kleiner). Der Compiler entscheidet heuristisch, welche Funktionen sind einfach genug sind, um auf diese Weise integriert werden zu können.

 Enabled at level `-O2'.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X