Если мы имеем void foo(const char * const ** bar);
и мы называем его char *** bar = malloc(...);
, такие как foo((const char * const **) bar);
возвращает:Почему вызов функции, которая принимает (const char * const **) с char ***, вызывает флаг -Wcast-qual?
error: to be safe all intermediate pointers in cast from ‘char ***’ to ‘const char * const**’ must be ‘const’ qualified [-Werror=cast-qual]
Попытку передать его в без литья приводит к предупреждению типа, но проходя char *
в const char *
работы, я также может передать char ***
в параметр функции char ** const *
, но я хочу получить больше только для чтения, чем только один уровень.
Цель состоит в том, что функция предполагает, что все данные указателя и передаваемый указатель являются доступными только для чтения, так что указатель не будет записываться каким-либо образом.
Я понимаю, что флаг является дополнительной один, но он определен как:
-Wcast-qual
Warn whenever a pointer is cast so as to remove a type qualifier from the target type. For example, warn if a const char * is cast to an ordinary char *.
Насколько я могу судить, ни один из типов классификатора не удаляются, а мы добавления отборочных типа в сообщите пользователю, что функция не изменяет никаких данных.
Почему упомянутый выше код запускает дополнительное предупреждение -Wcast-qual? Есть ли лучший способ перевести полный malloc'd тройной указатель как функцию только для чтения?
'Есть ли лучший способ перевести полный malloc'd тройной указатель как функцию только для чтения?'Да, не бросайте' malloc' вообще –
Кастинг вызывает ошибку «несовместимого типа указателя». Я на самом деле согласен, нет смысла бросать, но по какой-то причине компилятор этого не допустит. EDIT: Является ли const char * const ** не тем же типом, что и char ***, только с квалификаторами? – jake
Вы компилируете с помощью компилятора C++? –