Следующий фрагмент кода (правильно) дает предупреждение в C и сообщение об ошибке в C++ (с помощью GCC & г ++ соответственно, протестирована с версиями 3.4.5 и 4.2.1, MSVC, кажется, не волнует):Почему я не могу преобразовать 'char **' в 'const char * const *' в C?
char **a;
const char** b = a;
Я могу понять и принять это.
Решение C++ для этой проблемы состоит в том, чтобы изменить b как const char * const *, который запрещает переназначение указателей и препятствует обход const-correctness (C++ FAQ).
char **a;
const char* const* b = a;
Однако в чистом C, исправленный вариант (с использованием константный символ * сопзЬ *) по-прежнему выдает предупреждение, и я не понимаю, почему. Есть ли способ обойти это без использования броска?
Чтобы уточнить:
1) Почему это порождает предупреждение в C? Он должен быть полностью const-safe, и компилятор C++, похоже, распознает его как таковой.
2) Каков правильный способ принять этот символ ** в качестве параметра, сказав (и имея в силе компилятор), что я не буду изменять символы, на которые он указывает? Например, если я хотел бы написать функцию:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
И я хотел вызвать его на гольца **, что было бы правильным типом параметра?
Редактировать: Спасибо тем, кто ответил, особенно тем, кто затронул вопрос и/или выполнил мои ответы.
Я принял ответ, что то, что я хочу сделать, не может быть выполнено без приведения, независимо от того, возможно ли это.
Я в замешательстве относительно вашего вопроса: «Как мне заставить C не предупредить меня?» или это «Как мне заставить C++ не бросать ошибку компиляции?» Или, может быть, это не так. – user7116 2008-09-16 22:55:12
Я согласен с шестизначными переменными, этот вопрос нуждается в дополнительных разъяснениях. – 2008-09-16 23:00:18
Вопрос: «Почему я не могу преобразовать« char ** »в« char * const *? »? – Kevin 2008-09-16 23:05:53