LINUX.ORG.RU

[Си][gcc] в инициализации указуемые типы различаются знаковостью


0

0

Объясните пожалуйста, почему gcc выдает сабжевый ворнинг при попытке собрать программу, написанную на Си:

#include <stdio.h>

int main(void) {
	unsigned char *buf = "\x7f";
	printf("buf[0] = %d\n",(int)buf[0]);
	return 0;
}
Как собираю:
$ gcc -Wall -o test test.c
test.c: В функции ‘main’:
test.c:4: предупреждение: в инициализации указуемые типы различаются знаковостью
Причем если объявлять массив строк вот так:
unsigned char buf[] = "\x7f";
То все собирается без предупреждений.

★★★★★

FYI:
GCC 3.4.6
Intel C/C++ 10.1 и 11.1

собирают это без warnings, предупреждение пишут только GCC4.x

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

clang:
test.c:4:19: warning: pointer types point to integer types with different sign initializing 'char [2]', expected 'unsigned char *' [-Wpointer-sign]
unsigned char *buf = «\x7f»;

Sylvia ★★★★★ ()

Строковый литерал по умолчанию в GCC имеет тип «signed char *». В первом случае объявляется переменная «указатель на unsigned char» и инициилизируется указателем на signed char, отсюда ворнинг. Во втором случае ворнинга нет, т.к. происходит инициализация массива и преобразование типов элементов выполняется неявно.

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

Строковый литерал по умолчанию в GCC имеет тип «signed char *»

Спасибо за объяснение.

edigaryev ★★★★★ ()
Ответ на: комментарий от Sylvia
test.c:4:19: warning: pointer types point to integer types with different sign initializing 'char [2]', expected 'unsigned char *' [-Wpointer-sign]
unsigned char *buf = "\x7f"; 

А код вы изменяли? Это gcc-3.4.6?

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

http://clang.llvm.org/

новостей же куча была ) сейчас вот libstdc++ заменили на 85% на свою,
правда только для пталформы Apple

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