2011-07-22 68 views
0

嘗試使用gcc-4.6從源編譯wxWidgets-2.9.1使用c++0x標誌。我遇到了一個錯誤使用C++編譯wxWidgets 0x標誌

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/HORIZ。 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); hatches [i] = gdk_bitmap_create_from_data(NULL,reinterpret_cast < const char *>(bdiag_bits),bdiag_width,bdiag_height);

    //在文件bdiag.xbm和類似的修復中的所有* .xbm文件

  2. 靜態 bdiag_bits [] = {

    靜態無符號字符 bdiag_bits [] = { 0x80的,0x80的,0x40的,0x40的,爲0x20,0x20的,爲0x10,0x10的,0x08時,0x08時,0×04,×04, 0×02,0×02 0×01 0×01,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*上做一個reinterpret_cast?

+0

什麼是gchar定義? – piotr

+0

'typedef char gchar;' –

回答

1

unsigned char,signed charchar(也稱爲「普通炭」)是三種不同的類型。 unsigned char*char*之間沒有轉換。

+0

這意味着只有當'unsigned char'的ASCII值在'0'和'127'之間時,'reinterpret_cast'才能從'unsigned char'變爲'char'? –

+0

@Aditya形式上,演員的結果是實現定義的。除了「你最好知道你在做什麼」之外,沒有真正的指導原則,除了快速和骯髒的黑客攻擊之外,我不知道這裏的目的是什麼。 –

1

dataunsigned char*,但gdk_bitmap_create_from預計const char*reinterpret_cast正在處理簽名不匹配。