|
|
  |
Объясните почему именно const char в string.h, Зачем обязательно const |
|
|
|
Apr 11 2012, 05:16
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
чтобы можно было передать в функцию как константную строку так и нет. Пофантазируйте: ведь с не константной переменной ничего плохого не может случиться передав её в функцию по указателю на константу, а с константой фигушки - будь любезен и функцию напиши чтобы она получала обязательно указатели на константу ибо нет гарантии что код внутри функции не захочет измениь свои аргументы (по указателю на не константу). Ну и компилятор обязательно выдаст вам ошибку. Цитата(kolobochishe @ Apr 11 2012, 08:51)  Собственно, все работает и так нормально, но надоели warning'и компилятора. Не зря же он предупреждает Покажите пример и пример варнинга. Для AVR тулчейн?
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Apr 11 2012, 05:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (kolobochishe @ Apr 11 2012, 07:51)  Почему все функции используют именно const char * а не просто char * в качестве параметров? Это гарантия, которую дает автор функции в том, что эта функция не изменяет передаваемую ей строку. Это позволяет, как писал demiurg_spb, передавать в функцию указатели как на константные, так и на неконстантные строки, а компилятору позволяет лучше оптимизировать код, зная, что строка в этой функции не изменится и значит после вызова функции строку можно не перечитывать. Кроме того, если вы пишете свою функцию с указателем на константу в качестве параметра, то компилятор следит за тем, чтобы вы не нарушили свое обещание и случайно не записали внутри этой функции в передаваемый вам параметр. QUOTE (kolobochishe @ Apr 11 2012, 07:51)  но надоели warning'и компилятора. Не зря же он предупреждает Стандарт разрешает (требует от компилятора) неявное преобразование указателя на любой неконстантный тип в указатель на такой же константный тип. Значит дело не в const. Приведите текст предупреждения.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 11 2012, 06:39
|

Местный
  
Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634

|
Текст предупреждения: Warning[Pe167]: argument of type "unsigned char *" is incompatible with parameter of type "char const *" C:\ÐÀÁÎÒÀ\ÐÀÇÐÀÁÎÒÊÈ\ÏÐÎÅÊÒÛ\ÄÐÀÊÎÍ\Áàçà\Ïðîøèâêà\LPC3250 GUI_RTOS\arm\PowerPac\BoardSupport\NXP\LPC3250\Application\DeviceMenu.c 1103 Пример: Код unsigned char Buffer1[MaxFileNameSym], Buffer2[MaxFileNameSym], Buffer0[10]; ...
... if ((n == 2) || (n == 0)) GUI_DispStringAt(Buffer2, 20, 40); Что такое тулчейн?  Вообще для IAR для ARM.
|
|
|
|
|
Apr 11 2012, 07:05
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(kolobochishe @ Apr 11 2012, 09:39)  Что такое тулчейн?  Вообще для IAR для ARM. понятно. оно и есть. а так (без unsigned)? Код char Buffer1[MaxFileNameSym], Buffer2[MaxFileNameSym], Buffer0[10];
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Apr 11 2012, 07:26
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (kolobochishe @ Apr 11 2012, 09:39)  Текст предупреждения: Все верно. char, signed char и unsigned char - три разных типа. Стандарт допускает, что char реализуется как signed или unsigned char, но не оговаривает, какой именно (в большинстве компиляторов это можно задать ключем командной строки). Поэтому правило простое - если речь идет о символах - используем char без квалификаторов. Если же речь идет о байте - то unsigned либо signed char, а еще лучше - (u)int(_fast)8_t из stdint.h
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 11 2012, 08:02
|

Местный
  
Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634

|
Цитата(demiurg_spb @ Apr 11 2012, 12:05)  а так (без unsigned)? Код char Buffer1[MaxFileNameSym], Buffer2[MaxFileNameSym], Buffer0[10]; без unsigned все замечательно  а я на const подумал. просто у меня вся передача данных идет через буфер типа unsigned char и я как-то по инерции и строки под него также объявил. Посчитал что char и unsigned char - это одно и то же. неопределенность в знаке на усмотрение компилятора - это как-то нехорошо. Как вообще кодировка символов может быть со знаком?  Цитата(Сергей Борщ @ Apr 11 2012, 12:26)  Если же речь идет о байте - то unsigned либо signed char, а еще лучше - (u)int(_fast)8_t из stdint.h (u)int(_fast)8_t из stdint.h - это наверно для того, чтобы в случае изменения стандарта и изменения размера char с 1 байта на 2, например, старые программы тоже работали? Наверно много чего перестанет работать, если такое случится. По крайней мере, из того что написал я
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|