2012-07-20 45 views
1

我知道它的老問題,但簡單的解決方案是如何簡單地保留現在轉換爲c應用程序(舊版本)的舊邏輯C++?ISO C++禁止增加類型'void *'的指針,在舊版代碼中轉換爲C++

void *p; 
void *response = malloc(60 * 81); 

p = response ; 
p+=4; 

以g ++給出:ISO C++不允許對遞增型 '無效*' 更新的指針:
如果我改變它爲char *即時得到這個錯誤:

在C其工作

char *p; 
char *response = malloc(60 * 81); 

error: invalid conversion from ‘void*’ to ‘char*’ 

也char *可以容納其他類型(基本的)像short,int,bool? 這就是爲什麼在這個遺留代碼中使用,持有羞怯類型,

+0

在那裏4看起來像懷疑的'sizeof(void *)'的近似值,這是一個問題。 – Flexo 2012-07-20 13:29:26

回答

-2

因爲「pointeur算術」的... 如果你寫p += 4這意味着:p += ((sizeof(void *) * 4)

+0

這是不正確的。 Gcc將void *上的指針算術視爲char *。 – Art 2012-07-20 13:30:30

+0

這將是'p + =(sizeof(void)* 4)',當然這是無效的。你需要知道'* p'的預期類型才能給出正確的答案 – Attila 2012-07-20 13:30:53

+0

哦,好吧,不知道,thx – 2012-07-20 13:31:02

2

最簡單的方法是查找編譯器選項以更改此行爲。

最好的可能是改變類型爲char *,因爲這似乎符合用法和意圖。

3

它只適用於gcc。關於void *的指針arthimetic是未定義的。在這種情況下,Gcc將它視爲char *。因此,修復遺留代碼的最好方法是仔細將所有指向char *的指針更改。

1

從gnu C移植到C++不是微不足道的。算術void*不是C,它是一個擴展。

將這些東西移植到C++應該更仔細,特別是如果C代碼從一開始就不太合適。該數據具有「預期」類型,因此您應該在C++中使用該類型,而不是像char那樣的另一種猜測。顯然這不是C字符串,對C字符串做+= 4沒什麼意義。因此,假定基類型的大小爲4,可能來自代碼的其餘部分,您可以猜測這是如何解釋的。

一旦你有適當的類型,使用new[]來分配數組。如果可以避免使用C++,請不要使用malloc