| sv_lary писал(а) Fri, 25 December 2009 11:12 |
|
| Цитата: |
|
Это лекго проверить.
|
А меня заело… Я решил - ПРОВЕРИТЬ! И написал крохотную программку. Тексты, выданные компиллятором, я вставил прямо в текст программы в виде комментариев. Характерно, что сообщения об ОШИБКАХ появились именно там. где Вы и указывали. Хотя я смысла этого по прежнему и не понимаю… Но вот три дополнительных ВАРНИНГА меня убили… Короче, смотрите сами :
int main(int argc, char argv[]) { char sym = '\a'; char *p_sym = &sym; char **pp_sym = &p_sym; char*** ppp_sym = &pp_sym;// 1. Запрещает ***var1= const char*** var1; var1 = ppp_sym; // предупреждение: несовместимый тип указателя в присваивании *var1 = pp_sym; // предупреждение: несовместимый тип указателя в присваивании **var1 = p_sym;*** var1 = sym; // ошибка: assignment of read-only location ‘ ***var1’// 2. Запрещвет** var2=char * const **var2; var2 = ppp_sym; // предупреждение: несовместимый тип указателя в присваивании *var2 = pp_sym;** var2 = p_sym; // ошибка: assignment of read-only location ‘ **var2’*** var2 = sym;// 3. Запрещает *var3=char **const * var3; var3 = ppp_sym; *var3 = pp_sym; // ошибка: assignment of read-only location ‘*var3’** var3 = p_sym; ***var3 = sym;// 4.Запрещает var4=char*** const var4; var4 = ppp_sym; // ошибка: присваивание переменной ‘var4’, доступной только на чтение *var4 = pp_sym; **var4 = p_sym;*** var4 = sym;}
|
Ошибки пойманы верно. Ради этого и задумывался const.
Предупреждения связыны с тем, что в этих трех случаях нужно явно указать компилятору преобразования типа.
var1 = (char const ***)ppp_sym; // char*** -> char const ***
*var1 = (char const **)pp_sym; // char** -> char const **
var2 = (char * const **)ppp_sym; // char*** -> char * const **
Хотя мне кажется, достаточно было ограничиться предупреждениями при попытке обратного преобразования const char* -> char*
Почему нет предупреждений в трех других случаях?
**var1 = p_sym; // char* -> char const *
*var2 = pp_sym; // char** -> char * const *
var3 = ppp_sym; // char*** -> char ** const *
Этого я не знаю. Может, особенности реализации компилятора. Наверное, правильным является явно указать преобразования типа и в этих случаях.
Ну а в оставшихся все верно. Преобразования типа здесь не происходит.
***var2 = sym;
**var3 = p_sym;
***var3 = sym;
*var4 = pp_sym;
**var4 = p_sym;
***var4 = sym;
Проверил на gcc (Debian 4.3.2-1.1) 4.3.2
ошибки и предупреждения в тех же местах, что и у Вас.