LINUX.ORG.RU

warning: char ** -> const char *const *

 , ,


1

3
void f(const char *const *a) {}

int main(void)
{
	char **a;
	f(a);
	return 0;
}
kotik@kotik-laptop:/tmp:0> clang test7.c 
test7.c:6:4: warning: passing 'char **' to parameter of type 'const char *const *' discards qualifiers in nested pointer types
      [-Wincompatible-pointer-types-discards-qualifiers]
        f(a);
          ^
test7.c:1:27: note: passing argument to parameter 'a' here
void f(const char *const *a) {}
                          ^
1 warning generated.

Так и должно быть? Почему?

http://c-faq.com/ansi/constmismatch.html

tl;dr: const char ** - это указатель на const char *, а не на char *, который ты пытаешься передавать. Это разные типы, несмотря на то, что не-const можно привести к const. Для более вложенных указателей не работает даже это.

А вот превратить в const char * const * можно. Если это баг с getopt, то нужно соответственно изменить декларацию argv в main().

E ★★★ ()

Черт. Я в конец запутался. Я просто хочу пообещать, что не буду трогать ни указатели, ни данные.

Kotolegokot ()
Ответ на: комментарий от vzzo

Ты, видимо, хочешь void f(char **const a) {}

**a = 'a';, например, или *a = malloc(sizeof(char) * 100500); функция сможет, а не должна.

Kotolegokot ()
Ответ на: комментарий от E

А вот превратить в const char * const * можно.

Да, в C++, а в C это вроде так и не добавили, хотя может в новом стандарте.

xaizek ★★★★★ ()
Ответ на: комментарий от E

А что делать, если

Я просто хочу пообещать, что не буду трогать ни указатели, ни данные.

при том, что на const char *const * он ругает аналогично?

Kotolegokot ()
Ответ на: комментарий от Kotolegokot

Как выше писали, «const char *const *» действительно в C не работает, поэтому обещать компилятору надо вот так:

char **a;
f((const char **)a);

E ★★★ ()
Ответ на: комментарий от xaizek

в C это вроде так и не добавили, хотя может в новом стандарте

Нет, в новом тоже не добавили. :(

Т.е. нужно явно приводить тип к (const char * const *).

Sorcerer ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.