Как мне избежать предупреждения, когда у меня есть функция, которая может принимать как изменяемый, так и неизменяемый char*

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

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

Если вы не мутируете его, почему бы просто не принять const char* в качестве параметра?

UnholySheep 09.04.2019 19:44

@UnholySheep Потому что иногда я передаю простой char* функции, которая не является константой.

Tyler Durden 09.04.2019 19:46

Это функция, которую вы не можете изменить?

machine_1 09.04.2019 19:46

@TylerDurden Можно передать char * функции, которая принимает const char *.

Barmar 09.04.2019 19:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

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

Вы хотели сказать: «но вы можете скопировать неизменяемую строку» в конце?

machine_1 09.04.2019 19:55

Нет, я имел в виду то, что написал. Несмотря на то, что он объявлен const char *, вы можете скопировать char *.

Barmar 09.04.2019 19:57

Другие вопросы по теме