Вопрос:
Во время компиляции вызова следующей функции:
char* process_array_of_strings(const char** strings);
GCC жалуется, когда в качестве аргумента передается a char**:
note: expected ‘const char **’ but argument is of type ‘char **’
В то время как функция не изменяет символы (следовательно, const), она дублирует массив указателей, чтобы изменить сами указатели символов, поэтому постоянные указатели здесь определенно нежелательны.
Компиляция завершается успешно, и программа работает. Итак, как программист должен справиться с этим предупреждением?
Лучший ответ:
Вот почему char ** не преобразуется автоматически в const char ** в С++ и почему компилятор C выдает предупреждение, разрешая его.
/* This function returns a pointer to a string through its output parameter: */ void get_some_string(const char ** p) { /* I can do this because p is const char **, so the string won’t be modified. */ *p = «unchangeable string in program core»; } void f() { char * str; /* First, I’ll call this function to obtain a pointer to a string: */ get_some_string(&str); /* Now, modify the string: */ for (char * p = str; *p; p++) *p = toupper(*p); /* We have just overwritten a constant string in program core (or crashed). */ }
Из вашего описания того, что делает process_array_of_strings(), он может просто взять const char * const *, потому что он не изменяет ни указатели, ни символы (но дублирует указатели в другом месте). В этом случае описанный выше сценарий был бы невозможным, и теоретико-компилятор мог бы позволить вам автоматически преобразовывать char ** в const char * const * без предупреждений, но это не так, как определяется язык.
Итак, ответ очевидно, что вам нужен актерский состав (явный). Я написал это расширение, чтобы вы могли полностью понять, почему появляется предупреждение, что важно, когда вы решаете заставить его замолчать.
Ответ №1
Сделать преобразование явным с литой, и компилятор будет счастлив:
process_array_of_strings((const char**) foo);
В этих случаях вы должны явно сказать, что знаете, что делаете.