Rust’ta C-variadic fonksiyon tanımı yapacaksanız, doğru ABI ve hedef mimari eşleşmesini önce doğrulamalısınız; aksi halde tanım derlenmez ya da yanlış FFI yüzeyi oluşur. Özetle: variadic tanım yalnız belirli C tabanlı ABI’lerde geçerlidir, desteklenmeyen hedeflerde hata verir ve çağrı tarafında
Bu konu özellikle FFI yazarken, mevcut bir C API’sini Rust’ta birebir karşılamak isteyenler için önemlidir. Aşağıda önce hangi ABI’lerin geçerli olduğunu, sonra hangi hedeflerde güvenle tanım yazabileceğinizi ve son olarak çağırma tarafındaki en kritik sınırları ayırıyorum.
Tanım neden
Variadic imzalar çağrı zamanında sabit olmayan bir argüman listesi taşır. Bu yüzden fonksiyon tanımı
VaList kullanımının tip kuralları vardır.Bu konu özellikle FFI yazarken, mevcut bir C API’sini Rust’ta birebir karşılamak isteyenler için önemlidir. Aşağıda önce hangi ABI’lerin geçerli olduğunu, sonra hangi hedeflerde güvenle tanım yazabileceğinizi ve son olarak çağırma tarafındaki en kritik sınırları ayırıyorum.
Rust variadic tanımında doğru ABI seçimi
Hangi ABI’ler kabul edilir?
Rust Reference’a göre değişken argüman alan tanımlar yalnızcaextern "C" ve extern "C-unwind" ile yapılabilir; başka ABI’lerde variadic tanım desteklenmez. Normal Rust fonksiyonları ve diğer ABI’ler bu kullanım için uygun değildir.Tanım neden unsafe olmak zorunda?
Variadic imzalar çağrı zamanında sabit olmayan bir argüman listesi taşır. Bu yüzden fonksiyon tanımı unsafe olmalıdır; trait içindeki bildirimler için de aynı kural geçerlidir. extern blok içindeki bildirimler ise safe olabilir, ama bu durum tanım tarafındaki kuralı değiştirmez.Sözdiziminde dikkat edilecek sınır
Variadic parametre... biçimindedir ve yalnızca son parametre olabilir. Yani ... sonuna başka bir parametre ekleyemezsiniz. Ayrıca bu tür bir tanım async ya da const olamaz.Hangi hedeflerde tanım kararlı desteklenir?
Destekli hedef sınıfı
Rust Reference, C-variadic tanım desteğinin kararlı olduğu hedefleri listeler: x86 ve x86-64, ARM, AArch64 ve Arm64EC, RISC-V 32/64, LoongArch 32/64, s390x, PowerPC ve PowerPC64, AMDGPU ve NVPTX, Wasm32 ve Wasm64, C-SKY, Xtensa, Hexagon, SPARC64 ve MIPS. Bu liste dışındaki hedeflerde derleyici hata verebilir.Destek yoksa ne olur?
Desteklenmeyen bir hedefte tanım yazarsanız, Rust bunu kabul etmez. Bu, ABI doğru olsa bile hedef mimari yeterli değilse kodun derlenmeyeceği anlamına gelir.Pratik kontrol sırası
Önce hedef triple’ı, sonra ABI’yi, en son da imzayı kontrol etmek en güvenli sıradır. Çünkü destekli ABI ile desteklenmeyen hedef birleşimi yine başarısız olur.VaList okurken güvenli kullanım sınırları
Tip eşleşmesi neden önemli?
Variadic bölüm, içeride `VaList| Kontrol / Durum | Anlamı / Uygulama |
|---|---|
Sadece extern "C" veya extern "C-unwind" | Variadic tanım için uygun ABI seçilmelidir; diğer ABI’ler desteklenmez. |
Fonksiyon tanımı unsafe olmalı | Çağrı tarafı değişken olduğu için tanım güvenli işaretlenemez. |
... son parametre olmalı | Variadic bölüm başka parametrelerden sonra gelemez. |
| Hedef mimari destekli olmalı | Desteklenmeyen hedefte derleyici hata verir; tanımı o hedefe taşıyamazsınız. |
VaList::next_arg tipi eşleşmeli | Yanlış tip okuma UB doğurabilir; çağıran ve okuyan tür uyumu kontrol edilmelidir. |
async ve const kullanılamaz | Variadic tanımın bu niteliklerle birleştiği sürümler desteklenmez. |
| C FFI ile gerçek ihtiyaç olmalı | Rust variadic desteği C uyumluluğu içindir; normal Rust fonksiyonları variadic olmaz. |