extern |
Externe |
|---|---|
| Rust | |
Syntaxe
|
extern "C" { fn nom_de_la_fonction(paramètres) -> Retour; } |
Paramètres
| Nom | Description |
|---|---|
| "C" | Ce paramètre permet de spécifier la convention d'appel (ABI) utilisée pour lier du code externe, ici la convention C. |
| fn nom_de_la_fonction(paramètres) -> Retour | Ce paramètre permet de déclarer la signature d'une fonction externe (non Rust) accessible depuis Rust, avec son nom, ses paramètres et son type de retour. |
Description
Ce mot réservé permet de lier un crate, une fonction ou une variable externe.
Remarques
Permet d'indiquer un lien vers ou importation de code externe.
Le mot clef extern est utilisé à deux endroits en Rust. Le premier est associé au mot clef crate pour que votre code Rust reconnaisse les autres crates Rust de votre projet (extern crate lazy_static;). Le second est utilisé dans les interfaces de fonctions étrangères (FFI).
extern est utilisé dans deux contextes différents au sein des FFI. Le premier se présente sous la forme de blocs externes, pour déclarer des interfaces de fonctions permettant au code Rust d'appeler du code étranger. Cette utilisation d'extern est risquée, car elle garantit au compilateur que toutes les déclarations de fonctions sont correctes. Dans le cas contraire, l'utilisation de ces éléments peut entraîner un comportement indéfini.
Ce code tenterait de se lier à libmy_c_library.so sur les systèmes de type Unix et à my_c_library.dll sous Windows lors de l'exécution, et paniquerait s'il ne trouvait pas de lien. Le code Rust pourrait alors utiliser my_c_function comme n'importe quelle autre fonction Rust non sécurisée. Travailler avec des langages non Rust et FFI est intrinsèquement dangereux ; les wrappers sont donc généralement construits autour d'API C.
Le cas d'utilisation miroir de FFI est également réalisé via le mot-clef extern :
Si compilé en tant que dylib, le .so résultant pourrait alors être lié à partir d'une bibliothèque C, et la fonction pourrait être utilisée comme si elle provenait de n'importe quelle autre bibliothèque.