Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

C Dizgisi Sabitleri

Özet

  • c"foo" ya da cr"foo" biçimindeki sabitler, &core::ffi::CStr tü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.