2013-04-05 111 views
1

我正在用C++編寫一個程序,它接受一個ACT(Adobe Color Table)文件並將其轉換爲純文本可讀的JASC-PAL文件。我想從ACT文件中讀取二進制數據並將其存儲在內存中以供使用。我編寫了下面的代碼來完成這個工作,它使用BCC55構建。問題是我得到一個構建警告:「警告W8079:在函數read_file()中混合指向不同'char'類型的指針。C++混合指向不同字符類型的指針

unsigned char * memblock; 

bool read_file() 
{ 
    int filesize; 
    ifstream act ("test.act", ios::binary|ios::ate); 
    if (act.is_open()) 
    { 
     filesize = act.tellg(); 
     act.seekg(0); 
     memblock = new unsigned char [filesize]; 
     act.read(memblock, filesize); 
     act.close(); 
     cout << "Color Table loaded to memory." << endl; 
     return true; 
    } 
    else 
    { 
     cout << "Failed to open file." << endl; 
     return false; 
    } 
} 

它似乎是因爲我傳遞一個無符號的字符指針的函數期待一個普通字符指針Embarcadero的文檔網站,尋找這樣的警告了。它說這在技術上是不正確的,但通常是無害的。我的問題是,嚴格來說,如果這是不正確的,那麼在構建時如何在不引起W8079警告的情況下做到這一點?我應該甚至打擾這一點,因爲警告是無害的,我的代碼按預期工作?

+0

通常你不應該忽略編譯器的警告......你是否在某處釋放你的內存?這更糟糕...... – 2013-04-05 08:49:37

+0

爲什麼'memblock'使用'unsigned char'? – 2013-04-05 08:50:48

+1

當不同的API聚集在一起時,有一定數量的ick - 標準CI/O類型是'char',但字節存儲數組的自然類型是'unsigned char' ......很高興,這些類型完全兼容佈局,但是你可能不得不在某個時刻投入演員陣容。 – 2013-04-05 08:51:28

回答

1

添加演員。在這種情況下,我只會使用一個簡單的C演員。

act.read((char*)memblock, filesize); 

但你可以使用的reinterpret_cast以及

act.read(reinterpret_cast<char*>(memblock), filesize); 

但是這使得它似乎是一個更大的交易比它。正如文件所說,這是無害的。

+0

謝謝,我猜在這種情況下,指針類型並不重要,因爲它是1個字節。我使用unsigned char的原因是因爲我正在閱讀的數據被解釋爲數字,並且它作爲常規字符溢出到負值。 – Devin 2013-04-05 09:07:06

+0

請不要在C++代碼中推薦C風格轉換:它們引入了易碎的代碼點,如果我們與數據類型同步,會導致未定義的行爲),並且很難被工具找到(請參閱http://stackoverflow.com /問題/ 15408658 /替換鑄按功能通話中-C)。基本上,即使它們在代碼中添加它們時是正確的,在擴展/維護代碼時也必須明確地進行管理,但在代碼庫中很難找到它們。 – utnapistim 2013-04-05 09:07:16

+0

對於這段代碼,我想不出使用C風格轉換可能導致未來問題的任何維護任務。否則我不會推薦它。 – john 2013-04-05 09:28:53