C Dizgisi Sabitleri
Özet
c"foo"ya dacr"foo"biçimindeki sabitler,&core::ffi::CStrtüründe bir dizgiyi temsil eder.
Ayrıntılar
Rust 1.77 ile birlikte C dizgileri, c veya cr önekiyle C dizgisi sabiti
sözdizimi kullanılarak yazılabilir hale geldi.
Daha önce, sonu NUL baytıyla biten C API’leriyle birlikte çalışabilecek geçerli
bir dizgi sabiti üretmek zordu. cstr crate’i bunun için yaygın bir çözümdü;
ama bu yaklaşım, derlenmesi maliyetli bir proc-macro gerektiriyordu. Artık
C dizgileri doğrudan sabit sözdizimiyle yazılabiliyor. Bu sözdizimi, sonuna
otomatik olarak NUL baytı eklenmiş &core::ffi::CStr türünde bir değer üretir.
#![allow(unused)]
fn main() {
use core::ffi::CStr;
assert_eq!(c"hello", CStr::from_bytes_with_nul(b"hello\0").unwrap());
assert_eq!(
c"byte kacislari \xff calisir",
CStr::from_bytes_with_nul(b"byte kacislari \xff calisir\0").unwrap()
);
assert_eq!(
c"unicode kacislari \u{00E6} calisir",
CStr::from_bytes_with_nul(b"unicode kacislari \xc3\xa6 calisir\0").unwrap()
);
assert_eq!(
c"unicode karakterleri αβγ UTF-8 olarak kodlanir",
CStr::from_bytes_with_nul(
b"unicode karakterleri \xce\xb1\xce\xb2\xce\xb3 UTF-8 olarak kodlanir\0"
)
.unwrap()
);
assert_eq!(
c"dizgiler \
birden fazla satirda surebilir",
CStr::from_bytes_with_nul(b"dizgiler birden fazla satirda surebilir\0").unwrap()
);
}
C dizgileri, içeride NUL baytı bulunmasına izin vermez; örneğin \0 kaçağı gibi.
Normal dizgilere benzer şekilde, C dizgileri de cr önekiyle “ham”
sözdizimini destekler. Bu ham C dizgileri ters eğik çizgi kaçışlarını işlemez;
bu da ters eğik çizgi içeren dizgileri yazmayı kolaylaştırır. Çift tırnak
karakterleri, tırnakların etrafını # ile sararak içeri alınabilir. İçeride
"# dizileri varsa belirsizliği önlemek için birden fazla # de kullanılabilir.
#![allow(unused)]
fn main() {
assert_eq!(cr"foo", c"foo");
// İç tırnakları eklemek için `#` karakteri kullanılabilir.
assert_eq!(cr#""foo""#, c"\"foo\"");
// Bu örnek iki `#` gerektirir.
assert_eq!(cr##""foo"#"##, c"\"foo\"#");
// Kaçış dizileri işlenmez.
assert_eq!(cr"C:\foo", c"C:\\foo");
}
Daha fazla ayrıntı için Referans bölümüne bakın.
Taşıma
Taşıma yalnızca, c"…" ya da cr"…" benzeri bir token dizisini daha önce iki
ayrı token olarak varsayan makrolar için gereklidir. 2021 sürümünde bu yapı
tek token olarak görünür.
2021 sürümündeki sözdizimi ayırma çalışmasının bir parçası olarak, bu sorunla
karşılaşabilecek her makro girdisi rust_2021_prefixes_incompatible_syntax
taşıma lint’inden uyarı üretmelidir. Ayrıntılar için ilgili bölüme bakın.