Следующий фрагмент кода (правильно) выдает предупреждение на C и ошибку в C++ (с использованием gcc и g++ соответственно, протестировано с версиями 3.4.5 и 4.2.1; MSVC, похоже, не заботится):
char **a;
const char** b = a;
Я могу понять и принять это.
C++ решение этой проблемы состоит в том, чтобы изменить b на const char * const *, который запрещает переназначение указателей и не позволяет вам обходить const -корректность (C++ FAQ).
char **a;
const char* const* b = a;
Однако в чистом C исправленная версия (с использованием const char * const *) по-прежнему выдает предупреждение, и я не понимаю, почему. Есть ли способ обойти это без использования броска?
Чтобы уточнить:
1) Почему это генерирует предупреждение в C? Он должен быть полностью безопасным, и компилятор C++, похоже, распознает его как таковой.
2) Как правильно принять этот символ ** в качестве параметра, сказав (и принудительно установив компилятор), что я не буду изменять символы, на которые он указывает?
Например, если я хочу написать функцию:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
И я хотел бы вызвать его для символа **, какой тип параметра будет правильным?