Wie verwende ich C-Präprozessormakros mit Rust's FFI?

8

Ich schreibe Code, der an eine in C geschriebene Bibliothek anschließt. In meinem Rust-Code würde ich gerne Werte aus CPP-Makros verwenden können. Wenn ich ein C include.h habe, das so aussieht:

%Vor%

Ich würde es gerne in Rust so verwenden können:

%Vor%

Ich habe mir andere FFI-Codes angesehen und ich sehe viele Leute dupliziere diese Werte in Rust, anstatt sie vom FFI zu bekommen. Das scheint ein bisschen brüchig zu sein, und ich würde auch gerne damit umgehen können kompliziertere Dinge, die über CPP-Makros definiert sind. Das Ausführen von cpp über meine Rust-Dateien würde nur funktionieren, wenn ich sicher bin CPP-Makros werden nur für einfache Dinge verwendet.

    
jdeseno 31.01.2014, 16:55
quelle

2 Antworten

10

Es ist unmöglich, und ich glaube nicht, dass es in Zukunft möglich sein wird. C-Makros bringen zu viele Probleme mit sich. Wenn Sie cpp über Ihre Rust-Quellen ausführen möchten, können Sie dies manuell tun.

Wenn Sie es nicht tun wollen und viele Konstanten vorhanden sind und Sie auch nicht ihre Werte vom C-Code nach Rust kopieren möchten, können Sie einen C-Wrapper erstellen, der globale Variablen mit diesen Werten versorgt :

%Vor%

Sie kompilieren diese Datei, erstellen daraus eine statische Bibliothek und verknüpfen diese wie gewohnt:

%Vor%

Rost Quelle:

%Vor%

Rostquelle ist fast identisch mit dem, was Sie versucht haben zu erreichen. Sie werden jedoch eine C-Leimobjektdatei benötigen.

    
Vladimir Matveev 31.01.2014, 18:16
quelle
4

Das ist einfach unmöglich, weil eine C-Makro-Konstante zur Laufzeit kein Objekt oder Entity repräsentiert. Das liegt daran, dass der cpp Präprozessor die Makroerweiterung durchführt (und die restlichen Anweisungen behandelt), noch bevor die Kompilierung stattfindet. Betrachten Sie das folgende Snippet:

%Vor%

Das Ausführen von cpp auf dem Snippet führt zu vorverarbeitetem Code (so genannte Kompilierungseinheit oder Übersetzungseinheit ), bei dem alle INIT_FLAG durch das Literal% ersetzt sind. co_de%:

%Vor%

Die Kompilierungseinheit wird dann kompiliert, was zu der Objektdatei führt, aber jetzt gibt es keine Spur von 0x00000001 darin. Daher können Sie beim Verknüpfen mit der Objektdatei nicht auf INIT_FLAG verweisen: Sie enthält einfach kein solches Symbol.

    
nameless 02.02.2014 15:36
quelle

Tags und Links