Bu sorunun ( char* str = "some string"
diğerlerinin açıkladığı sorundan daha zor algılanması daha da zor olan) bir nedeni , kullandığınız durumdur constexpr
.
constexpr char* str = "some string";
Öyle görünüyor ki, daha const char* str
önce olduğu gibi bir uyarıya neden olmayacak ve bu yüzden bir uyarıya neden olmayacak char*
, ancak bunun gibi davranıyor gibi görünüyor char* const str
.
ayrıntılar
Sabit işaretçi ve sabitin işaretçisi. Arasındaki fark const char* str
, ve char* const str
aşağıdaki gibi açıklanabilir.
const char* str
: Str değerini bir const char için bir işaretçi olarak bildirin. Bu, bu işaretçinin işaret ettiği verinin sabit olduğu anlamına gelir. İşaretçi değiştirilebilir, ancak verileri değiştirme girişimleri bir derleme hatası verir.
str++ ;
: VALID . İşaretçiyi değiştiriyoruz, işaret eden verileri değil.
*str = 'a';
: GEÇERSİZ . İşaretlenen verileri değiştirmeye çalışıyoruz.
char* const str
: Str karakterini bir const pointer olarak bildirin. Bu, noktanın artık sabit olduğu anlamına gelir, ancak işaret edilen veriler de sabit değildir. İşaretçi değiştirilemez, ancak işaretçiyi kullanarak verileri değiştirebiliriz.
str++ ;
: GEÇERSİZ . Sabit olan pointer değişkenini değiştirmeye çalışıyoruz.
*str = 'a';
: VALID . İşaretlenen verileri değiştirmeye çalışıyoruz. Bizim durumumuzda bu bir derleme hatasına neden olmaz, ancak dize büyük olasılıkla derlenmiş ikilinin salt okunur bir bölümüne gireceğinden çalışma zamanı hatasına neden olur . Bu ifade, örneğin dinamik olarak bellek ayırmış olsaydık anlamlıdır. char* const str = new char[5];
.
const char* const str
: Str'yi bir const char için bir const pointer olarak bildirin. Bu durumda, işaretçiyi veya işaret edilen verileri değiştiremeyiz.
str++ ;
: GEÇERSİZ . Sabit olan pointer değişkenini değiştirmeye çalışıyoruz.
*str = 'a';
: GEÇERSİZ . Bu işaretçinin işaret ettiği verileri de değiştirmeye çalışıyoruz ki bu da sabittir.
Benim durumumda, görsel olarak eskisine daha yakın göründüğü için değil constexpr char* str
gibi davranmayı bekliyordum .const char* str
char* const str
Ayrıca, için oluşturulan uyarı constexpr char* str = "some string"
biraz farklıdır char* str = "some string"
.
- Derleyici uyarısı
constexpr char* str = "some string"
:ISO C++11 does not allow conversion from string literal to 'char *const'
- İçin Derleyici uyarı
char* str = "some string"
: ISO C++11 does not allow conversion from string literal to 'char *'
.
İpucu
Sen kullanabilirsiniz C anlamsız ↔ İngilizce dönüştürücü dönüştürme için C
kolayca anlaşılabilir İngilizce açıklamalara bildirimleri ve tersi de geçerlidir. Bu C
tek bir araçtır ve bu nedenle münhasır olan şeyleri (constexpr gibi) desteklemeyecektir C++
.
strncpy(str, func, 255)
yerine kullanmalısınızstrcpy(str, func)
. Ve sonra strncpy eklemediği için dizenin sonuna '\ 0' eklemeyi unutmayın.