SORU
16 EYLÜL 2008, Salı


Neden't İ 'char**' 'sabit karakter* sabit*' C dönüştürebilirsiniz?

Aşağıdaki kod parçacığını (doğru) C uyarı ve C (kullanarak gcc ve g sırasıyla, 3.4.5 sürümleri ile test edilmiş ve 4.2.1; MSVC da umurunda değil): hata verir

char **a;
const char** b = a;

Anlamak ve bunu kabul edebilirim.
Bu sorun için çözüm C işaretçileri değiştirme izin vermez ve sabit-doğruluğu engellemeyi engelleyen*, (C FAQ) * sabit, sabit bir karakter olarak b değiştirmektir.

char **a;
const char* const* b = a;

Ancak, saf C, düzeltilmiş sürümü (sabit karakter * sabit * kullanarak) hala bir uyarı verir, ve neden anlamıyorum. Bir şekilde bir cast kullanmadan bu sorunun üstesinden gelmek için var mı?

Netleştirmek için:
1) Neden bu C bir uyarı oluşturur mu? Tamamen sabit-güvenli olmalı, ve C derleyici gibi onu tanıyamıyor.
2) Ne işaret karakterleri değiştirme olmayacağım derken bir parametre olarak char** kabul hakkında gitmek için doğru yoldur (ve derleyici zorlamak zorunda)? Eğer bir fonksiyon yazmak istedim, örneğin:

void f(const char* const* in) {
  // Only reads the data from in, does not write to it
}

Ve bir char onu çağırmak istedim parametresi için doğru türü ne olacağını**,?

Edit: Cevap verenler için, soru ve/veya ele yanıtlarım takip eden özellikle teşekkür ederim.

Yapmak istediğim şey bir dökme olmadan yapılan, ya da mümkün olmalıdır ne olursa olsun, olamaz bu cevabı kabul ettim.

CEVAP
16 EYLÜL 2008, Salı


Aynı sorun birkaç yıl önce vardı ve bana çok canı sıkıldı.

C kuralları daha basit (yani char** sabit dönüştürme gibi özel durumlar listesinde yok karakter*sabit*) belirtilmiştir. Consequenlty, sadece izin verilen değil. C standardı ile, bu gibi durumlarda izin vermek için daha fazla kural yer aldı.

Sonunda, sadece C standart bir sorun. Bir sonraki standardı (Teknik Rapor) bu adresi umuyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 07cadikiz07

    07cadikiz07

    17 EKİM 2007
  • Matthew Pearce

    Matthew Pear

    9 AĞUSTOS 2009
  • Nick Pitera

    Nick Pitera

    8 NİSAN 2006