компиляция wxWidgets с флагами c ++ 0x

При попытке скомпилировать wxWidgets-2.9.1 из исходного кода с c++0x флагами с использованием gcc-4.6. Я обнаружил ошибку

narrowing conversion of '128' from 'int' to 'char' inside { } [-fpermissive] в файле src/gtk/dcclient.cpp. Ошибка возникает из следующих файлов:

  1. src / gtk / bdiag.xbm
  2. src / gtk / cdiag.xbm
  3. src / gtk / fdiag.xbm
  4. src / gtk / horizon.xbm
  5. SRC / GTK / verti.xbm
  6. SRC / GTK / cross.xbm

Это известная ошибка. http://trac.wxwidgets.org/ticket/12575 Итак, я сделал то, что требовалось, и программа компилируется нормально.

По сути, есть два типа исправлений, которые есть в файле diff.

// в файле dcclient.h

  1. штриховки [i] = gdk_bitmap_create_from_data (NULL, bdiag_bits, bdiag_width, bdiag_height); штриховки [i] = gdk_bitmap_create_from_data (NULL, reinterpret_cast ‹const char *> (bdiag_bits), bdiag_width, bdiag_height);

    // в файле bdiag.xbm и аналогичные исправления во всех файлах * .xbm

  2. static char bdiag_bits [] = {

    статический символ без знака bdiag_bits [] = {0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x80, 0x80 , 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01};

Я понимаю вторую fix, но не могу понять первую. Зачем нужно делать reinterpret_cast< const char* > Функция gdk_bitmap_create_from_data объявлена ​​так:

typedef char   gchar;//in some other header file

GdkBitmap* gdk_bitmap_create_from_data (GdkDrawable *drawable, const gchar *data, gint width, gint height);

а несколькими строками позже в том же файле dcclient.cpp следующий вызов gdk_bitmap_create_from_data не дает никаких ошибок.

char* data = new char[data_size];
//...
GdkPixmap* pixmap = gdk_bitmap_create_from_data(mask, data, dst_w, dst_h);

Теперь здесь не требуется приведения типов. Почему нам нужно сделать новую интерпретацию static unsigned char*?


person A. K.    schedule 22.07.2011    source источник
comment
для чего определен gchar?   -  person piotr    schedule 22.07.2011


Ответы (2)


unsigned char, signed char и char (также известные как «простые символы») - это три разных типа. Преобразования между unsigned char* и char* нет.

person Luc Danton    schedule 22.07.2011
comment
так это означает, что reinterpret_cast от unsigned char до char следует использовать только тогда, когда unsigned char имеет значения ASCII между 0 и 127? - person A. K.; 22.07.2011
comment
@Aditya Формально результат приведения определяется реализацией. Нет никакого реального руководства, кроме того, что вам лучше знать, что вы делаете, и я не знаю, что здесь было намерением, кроме быстрого и грязного взлома. - person Luc Danton; 22.07.2011

data имеет тип unsigned char*, но gdk_bitmap_create_from ожидает const char*. reinterpret_cast занимается несоответствием подписи.

person Ben Voigt    schedule 22.07.2011