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