Если функция может принимать как изменяемые, так и неизменяемые строки, поскольку она фактически никогда не изменяет строку, она должна быть объявлена для приема const char *
.Это не должно вызывать никаких предупреждений, и нет необходимости приводить аргумент.
Объявление параметра в качестве указателя на const выражает обещание не изменять данные.Вы получите ошибки в определении функции, если она действительно попытается назначить через указатель или передаст ее функции, которая не объявляет этот параметр const
.Но вызывающий не ограничен в постоянстве аргумента - нет проблем с передачей изменяемых данных в функцию, которая фактически не изменяет их.
В качестве примера, см. Объявление strcpy()
:
char * strcpy ( char * destination, const char * source );
Параметр source
объявлен const char *
, но вы можете скопировать изменяемую строку.Но вы, конечно, не можете передать неизменяемую строку в качестве аргумента destination
(вам придется привести ее к неконстантному указателю, чтобы компилятор ее принял, но вы вызовете неопределенное поведение, если вы действительно передадитенеизменяемая строка).