Как избежать предупреждения, когда у меня есть функция, которая может принимать как изменяемые, так и неизменные символы * - PullRequest
1 голос
/ 09 апреля 2019

У меня есть функция C, которая принимает char* в качестве аргумента, а в некоторых случаях я передаю const char* функции.Внутренне, функция копирует строку перед использованием, поэтому она может принять изменяемую или неизменяемую строку.

К сожалению, это генерирует предупреждение, потому что в некоторых случаях я передаю const в функцию.В настоящее время я избегаю этого предупреждения, приводя ввод к простому char*.Это правильная практика?

1 Ответ

6 голосов
/ 09 апреля 2019

Если функция может принимать как изменяемые, так и неизменяемые строки, поскольку она фактически никогда не изменяет строку, она должна быть объявлена ​​для приема const char *.Это не должно вызывать никаких предупреждений, и нет необходимости приводить аргумент.

Объявление параметра в качестве указателя на const выражает обещание не изменять данные.Вы получите ошибки в определении функции, если она действительно попытается назначить через указатель или передаст ее функции, которая не объявляет этот параметр const.Но вызывающий не ограничен в постоянстве аргумента - нет проблем с передачей изменяемых данных в функцию, которая фактически не изменяет их.

В качестве примера, см. Объявление strcpy():

char * strcpy ( char * destination, const char * source );

Параметр source объявлен const char *, но вы можете скопировать изменяемую строку.Но вы, конечно, не можете передать неизменяемую строку в качестве аргумента destination (вам придется привести ее к неконстантному указателю, чтобы компилятор ее принял, но вы вызовете неопределенное поведение, если вы действительно передадитенеизменяемая строка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...