Lua Academy · Lektion

C-Funktionen über FFI aufrufen

Rufen Sie libc- und eigene Funktionen gemeinsam genutzter Bibliotheken ohne zusätzlichen Overhead aus Lua auf

Lektion 2 von 413 Schritte

C-Funktionen über FFI aufrufen ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Direkte C-Funktionsaufrufe

Nach der Deklaration mit ffi.cdef werden C-Funktionen über das Bibliotheksobjekt genauso wie Lua-Funktionen aufgerufen. Argumente und Rückgabewerte werden automatisch konvertiert.

local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2))  -- 1.0

Typkonvertierung

Lua-Zahlen werden standardmäßig zu C- doubles. Die FFI konvertiert sie automatisch in den deklarierten C-Parametertyp. Boolesche Werte werden zu 0/1. Strings werden zu const char*.

printf aufrufen

printf ist eine variable C-Funktion. Rufen Sie sie über ffi.C.printf mit Formatzeichenfolgen und Argumenten auf.

ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)

Rückgabewerte verarbeiten

C-Rückgabewerte werden automatisch in Lua-Typen konvertiert. Ganzzahlen werden zu Lua-Zahlen, char* wird zu lightuserdata. Verwenden Sie ffi.string zur Konvertierung.

ffi.cdef[[ char *getenv(const char *name); ]]
local ptr = ffi.C.getenv("HOME")
if ptr ~= nil then
  print(ffi.string(ptr))
end

ffi.string

ffi.string(ptr, len) konvertiert einen char*-Zeiger in einen Lua-String. Ohne len wird bis zu einem Nullbyte gelesen.

Fehlerbehandlung

C-Funktionen geben Fehlercodes zurück oder setzen errno. Überprüfen Sie Rückgabewerte ausdrücklich. Greifen Sie über ffi.errno() auf errno zu.

ffi.cdef[[ int open(const char *path, int flags); ]]
local fd = ffi.C.open("missing.txt", 0)
if fd < 0 then
  print("Error:", ffi.errno())
end

Struct-Argumente

Übergeben Sie C-Structs als Wert oder Zeiger. Erzeugen Sie sie mit ffi.new.

ffi.cdef[[
  typedef struct { int x, y; } Point;
  void printPoint(Point p);
]]
local p = ffi.new("Point", {x=3, y=4})
lib.printPoint(p)

Zeigerargumente

Übergeben Sie Ausgabezeiger an Funktionen, die mehrere Werte über Zeigerparameter zurückgeben.

ffi.cdef[[
  void minmax(double *arr, int n, double *min, double *max);
]]
local arr = ffi.new("double[5]", {5,2,8,1,9})
local mn, mx = ffi.new("double[1]"), ffi.new("double[1]")
lib.minmax(arr, 5, mn, mx)
print(mn[0], mx[0])

Leistung von FFI-Aufrufen

FFI-Aufrufe von C-Funktionen haben nahezu keinen Overhead und sind deutlich schneller als Lua-zu-C-Aufrufe über die traditionelle C API. Der JIT kann den Aufruf häufig vollständig inline einfügen.

Variable Funktionen

Variable C-Funktionen (...) müssen mit den korrekten Typen aufgerufen werden. Übergeben Sie bei Bedarf explizite Typumwandlungen, um Mehrdeutigkeiten zu vermeiden.

ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))

Sicherheitspraktiken

Überprüfen Sie Rückgabewerte von Zeigern immer auf NULL. Übergeben Sie niemals einen freigegebenen oder außerhalb seines Gültigkeitsbereichs liegenden Zeiger. Verwenden Sie ffi.gc, um Finalizer an C-Speicherreservierungen anzuhängen.

Frage zu FFI-Aufrufen

Wie konvertiert die FFI einen Lua-String in ein C-const char*?

Rückblick: C über die FFI aufrufen

Rufen Sie C-Funktionen über das Bibliotheksobjekt genauso wie Lua-Funktionen auf. Die FFI übernimmt die Typkonvertierung. Verwenden Sie ffi.string für char*-Rückgabewerte, ffi.errno() für Fehler und ffi.new für Struct- und Array-Argumente.

Kostenlos starten

Lerne Lua mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
40
Lektionen
159

Häufig gestellte Fragen

Ist die Lektion „C-Funktionen über FFI aufrufen“ kostenlos?

Ja — der vollständige Text von „C-Funktionen über FFI aufrufen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „C-Funktionen über FFI aufrufen“?

Rufen Sie libc- und eigene Funktionen gemeinsam genutzter Bibliotheken ohne zusätzlichen Overhead aus Lua auf Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „C-Funktionen über FFI aufrufen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. FFI-Grundlagen: ffi.cdef und ffi.load
  2. C-Funktionen über FFI aufrufen
  3. Pointer, Structs und Arrays im FFI
  4. Callbacks: Lua-Funktionen an C übergeben
← Zurück zu Lua Academy