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
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.
Karakter isimleri sabit değildir Neden...
Neden bana C bir sabit, sabit bir char...
char * karşı sabit karakter *sabit sab...
C tipi işaretsiz char * karakter *sabi...
Dönüştürmek için nasıl bir std::string...