Могу ли я передать char * в const char * в C? - PullRequest
1 голос
/ 02 октября 2019

Я реализую функцию, которая преобразует строку в double в C. Функция не является деструктивной, то есть я не изменяю переданную строку и просто читаю ее в функции. Я хочу передать в функцию char *, const char *, а также строковый литерал.

Подходит ли для этой цели следующая функция? Я думаю, что вопрос сводится к тому, определена ли разрешенная передача char * к const char * в C.

double str2double( const char* input);

Спасибо. (Я нашел похожее название вопроса, но их ответы для меня расплывчаты, и я спрашиваю здесь.)

Ответы [ 2 ]

5 голосов
/ 02 октября 2019

Да, char *input может быть назначено для переменной типа const char * с неявным преобразованием типа, а аргументы C работают как при присваивании . Правило это в C11 6.5.16.1.1 :

6.5.16.1 Простое назначение

Ограничения

  1. Должно быть выполнено одно из следующих действий:

[...]

  • левый операнд имеет атомный, квалифицированный или неквалифицированный тип указателя и (учитываятип, который будет иметь левый операнд после преобразования lvalue) оба операнда являются указателями на квалифицированные или неквалифицированные версии совместимых типов, а тип, на который указывает левый, имеет все квалификаторы типа, на который указывает правый;

[...]

При выполнении

const char *cinput;
cinput = input;

левый операнд cinput имеет неквалифицированный тип указателя (тип указателя сам не является const -квалифицированным);как и правый операнд.

Левый операнд - указатель - a const-квалифицированный тип (const char) и тип, указанныйк правый операнд не имеет квалификаторов. Тип, на который указывает левый угол, имеет поэтому все квалификаторы типа , на которые указывает правый и дополнительный const квалификатор, следовательно, назначение является действительным.

И при вызове функции

double str2double(const char* input);

[...]

char *foo = ...
str2double(foo);

поведение такое, как если бы значение foo было присвоено параметру input простым присваиванием.

Строковый литерал в C имеет тип массива неквалифицированный символ , который уменьшается до char *, т. Е. Если бы не было нормально передавать char * в такую ​​функцию, выневозможно использовать double str2double( const char* input);, передавая строковый литерал в качестве аргумента.

2 голосов
/ 02 октября 2019

Да, это разрешено. Использование const в этом случае является хорошей практикой. Добавляя его к аргументам функции, вы обещаете не изменять данные, расположенные в input.

...