Я знаю, что неявное преобразование из char **
в const char **
не может быть выполнено и почему и что преобразование в char *const *
работает. См. Ниже ссылки для объяснения этого.
Все это имеет смысл, кроме одной конкретной вещи. Поэтому у меня есть следующий код:
#include <stdio.h>
void
print(const char *const*param)
{
printf("%s\n", param[0]);
}
int
main(int argc, char **argv)
{
print(argv);
return 0;
}
Если я скомпилирую это как код на С++, он компилируется довольно хорошо. Однако, если один и тот же код скомпилирован только как код C, я получаю сообщение об ошибке (ну, предупреждение, но пусть -Werror
, т.е. Обрабатывать предупреждения как ошибки).
НКА:
test.c: In function ‘main’:
test.c:12:11: warning: passing argument 1 of ‘print’ from incompatible pointer type [-Wincompatible-pointer-types]
print(argv);
^
test.c:4:1: note: expected ‘const char * const*’ but argument is of type ‘char **’
print(const char *const*param)
^
лязг:
test.c:12:11: warning: passing 'char **' to parameter of type 'const char *const *' discards qualifiers in nested pointer types [-Wincompatible-pointer-types-discards-qualifiers]
print(argv);
^~~~
test.c:4:25: note: passing argument to parameter 'param' here
print(const char *const*param)
^
Оба поведения являются стандартно независимыми, а также независимыми от компилятора. Я пробовал различные стандарты с gcc
и clang
.
Для этого запроса есть две причины. Во-первых, я хочу понять, есть ли разница, и, во-вторых, у меня есть функция, которая ничего не делает с любым слоем указателей, и мне нужно, чтобы она работала с const char **
, а также char *const *
и char **
. Явное выполнение каждого вызова не поддерживается. И я не знаю, как должен выглядеть прототип функции.
Это вопрос, который вызвал мое любопытство: Неявное преобразование из char ** в const char **
И вот еще одно приятное объяснение проблемы char ** => const char**
:
http://c-faq.com/ansi/constmismatch.html
Если ссылки запутаны в связи с этим вопросом, не стесняйтесь их редактировать.