Grundsätzlich gibt es zwei Teile auf diese Frage:Ist es möglich, Variablen prozedural mit Rust-Makros zu deklarieren?
Können Sie eine unbekannte Kennung zu einem Makro in Rust passieren?
Können Sie Zeichenfolgen kombinieren, um neue Variablennamen in einem Rust-Makro zu generieren? !
Zum Beispiel so etwas wie:
macro_rules! expand(
($x:ident) => (
let mut x_$x = 0;
)
)
Aufruf erweitern (hallo) offensichtlich schlägt fehl, da hallo eine unbekannte Kennung ist; aber kannst du das irgendwie machen?
dh. Das Äquivalent in C von etwas wie:
#include <stdio.h>
#define FN(Name, base) \
int x1_##Name = 0 + base; \
int x2_##Name = 2 + base; \
int x3_##Name = 4 + base; \
int x4_##Name = 8 + base; \
int x5_##Name = 16 + base;
int main() {
FN(hello, 10)
printf("%d %d %d %d %d\n", x1_hello, x2_hello, x3_hello, x4_hello, x5_hello);
return 0;
}
Warum Sie sagen, was für eine schreckliche Idee. Warum würdest du das jemals tun wollen?
Ich bin froh, dass Sie gefragt haben!
diesen Rostblock vor:
{
let marker = 0;
let borrowed = borrow_with_block_lifetime(data, &marker);
unsafe {
perform_ffi_call(borrowed);
}
}
Sie jetzt einen geliehenen Wert mit einer explizit begrenzten Lebensdauer hat (Marker), die keine Struktur Lebensdauer verwendet, sondern dass wir existiert für den gesamten Umfang garantieren können der Anruf ffi; zur selben Zeit kommen wir nicht zu obskuren Fehlern, wo ein *
unsicher in einem unsicheren Block de-referenziert wird und so der Compiler es nicht als ein Fehler abfängt, trotz des Fehlers innerhalb eines sicheren Blocks gemacht wird.
(siehe auch Why are all my pointers pointing to the same place with to_c_str() in rust?)
die Verwendung eines Makros, die temporäre Variablen für diesen Zweck erheblich die Probleme lindern würde erklären kann ich mit dem Compiler haben zu kämpfen. Deshalb möchte ich das machen.
concat_idents könnte ich entfernt, es war bereits Feature-Gated [# 13295] (https://github.com/mozilla/rust/pull/13295) und [# 13294] (https://github.com/mozilla/rust/issues/13294) – Arjan
Wir brauchen diese Funktion, die mit ## in C vergleichbar ist. Ich muss ständig Makros schreiben, wo Benutzer mir zwei Namen geben, weil String Concat so begrenzt ist. –