2012-12-06 16 views
6

Powiel możliwe:
why isnt it legal to convert (pointer to pointer to non-const) to a (pointer to pointer to a const)zły połączenia z podpisem const w C

Dlaczego dostaję ostrzeżenie (GCC 42,2) z następującym wezwaniem foo?

void foo(const char **str) 
{ 
    (*str)++; 
} 

(...) 
char **str; 
foo(str); 
(...) 

rozumiem dlaczego nie możemy wywołać funkcję, która wyłączając się char ** z const char **, ale przeciwnie wydaje się ok do mnie, więc dlaczego następujące ostrzeżenie?

warning: passing argument 1 of 'foo' from incompatible pointer type 
+4

jakie jest ostrzeżenie? –

+0

Przepraszam, po prostu dodano – Guid

+0

z jakich znaczników kompilacji korzystasz? –

Odpowiedz

8

To jest złe. Nie ma tu miejsca na dyskusję z kompilatorem, ponieważ jest obsługiwany przez specyfikację. Oto przykład, który wyjaśnia dokładnie, dlaczego jest źle:

void func(const char **p) 
{ 
    *p = "abc"; 
} 

void func2(void) 
{ 
    char *a; 
    func(&a); 
    *a = 'x'; 
} 

Jeśli kompilator nie wypluł błąd, program będzie prawdopodobnie awarii, ponieważ chcesz być nadpisywania ciąg dosłowne (która często jest oznaczony do odczytu tylko w pamięci).

Więc nie można niejawnie oddanych char ** do const char ** bo to pozwala na usunięcie const kwalifikator z dowolnej wartości - w zasadzie, to pozwala ignorować const do woli bez wyraźnego obsady.

Głównym powodem, dla którego kompilator wyświetla ostrzeżenie zamiast błędu, jest to, że wiele starych kodów nie używa kwalifikatora const w miejscu, w którym byłoby, gdyby kod został napisany dzisiaj.