Const char ** предупреждение о параметре char ** аргумент

Вопрос:Во время компиляции вызова следующей функции: char* process_array_of_strings(const char** strings); GCC жалуется, когда в качестве аргумента передается a char**: note: expected ‘const char **’ but argument is of type ‘char **’ В то время как функция не изменяет символы (следовательно, const), она дублирует массив указателей, чтобы изменить сами указатели символов, поэтому постоянные указатели здесь определенно

Вопрос:

Во время компиляции вызова следующей функции:

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);

В этих случаях вы должны явно сказать, что знаете, что делаете.

Оцените статью
Добавить комментарий