stdcall und cdecl

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6969
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

stdcall und cdecl

Beitrag von Mathias »

Wann wir was verwendet ?

Ich habe bis jetzt schon mehrere C-Header übernommen und bin mit "cdecl" gut gefahren. Dies waren immer Linux Sachen.
Jetzt wollte ich eine OpenGL-Header ausprobieren.. Unter Linux funktioniert es wunderbar mit "cdecl". Aber unter Windows hatte ich Fehler.
Also habe ich versucht "cdecl" durch "stdcall" zu ersetzen und sehr das es läuft unter windows.
Und zur meiner Verwunderung auch mit Linux.

Gibt es da eine Unterschied zwischen Linux und Windows ?
Was ich gerade festgestellt habe, unter Linux kann ich es sogar ganz weglassen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: stdcall und cdecl

Beitrag von theo »

Hast du auch den Speicher überprüft?
https://www.freepascal.org/docs-html/pr ... -1750006.3

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: stdcall und cdecl

Beitrag von six1 »

So etwas in der Art hatte ich auch schon und habe das mit Compilerschaltern gelöst.
Ich musste damals eine LIB für Fingerprint übersetzen. War dann für WIN und LIN unterschiedlich definiert mit stdcall und cdecl
Gruß, Michael

Mathias
Beiträge: 6969
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: stdcall und cdecl

Beitrag von Mathias »

So etwas in der Art hatte ich auch schon und habe das mit Compilerschaltern gelöst.
Das werde ich wohl auch machen müssen.
Aber wieso das riessen durcheinander ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 964
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: stdcall und cdecl

Beitrag von PascalDragon »

Mathias hat geschrieben: Sa 30. Mär 2024, 14:21 Gibt es da eine Unterschied zwischen Linux und Windows ?
Was ich gerade festgestellt habe, unter Linux kann ich es sogar ganz weglassen.
Kompilierst du unter Windows für 32-Bit und unter Linux für 64-Bit? Die Aufrufkonventionen cdecl and stdcall sind nämlich nur für die i386-Plattform (und die i8086) relevant. Bei der x86_64-Plattform (und allen nicht-x86-Plattformen) gibt es nur eine einzige Aufrufkonvention.

Würdest du also unter Linux für i386 kompilieren, würdest du Unterschiede zwischen cdecl und stdcall feststellen. Genauso wenn du unter Windows für x86_64 kompilieren würdest, würdest du eben keine Unterschiede feststellen.
Mathias hat geschrieben: Sa 30. Mär 2024, 17:17
So etwas in der Art hatte ich auch schon und habe das mit Compilerschaltern gelöst.
Das werde ich wohl auch machen müssen.
Also entweder nutzt du {$CALLING ...} oder du nutzt anstatt cdecl/stdcall die Direktive winapi. Im Gegensatz zum Namen (welcher von Delphi kommt) steht das einfach für die Haupt-C-Aufrufkonvention der Plattform, also stdcall unter Windows und cdecl unter Linux und macOS.
Mathias hat geschrieben: Sa 30. Mär 2024, 17:17 Aber wieso das riessen durcheinander ?
Wie so gern: historisch. Microsoft hat sich eben für stdcall als sein Hauptkonvention für Windows unter 32-Bit x86 entschieden und die *nix-Systeme für cdecl.
FPC Compiler Entwickler

Antworten