2015-11-18 14 views
5

Gdy skompiluję następujący kod z gcc i g++, g++ daje błąd, a nie gcc. Zauważ, że kod konwertuje z int (*)[4] na int (*)[] (który jest wskaźnikiem na niekompletny typ tablicy).Różnice w niepełnych regułach tablicy wskaźnika między C i C++

int arr[4]; 
int (*p_arr)[] = &arr; 

Jak omówiono w Incomplete array type?, C język pozwala tej konwersji. Ale dlaczego C++ tego nie akceptuje i podaje błąd error: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignment. Wiem, że C++ jest bardziej bezpieczny dla typu niż C, ale czy to przypisanie jest naprawdę niebezpieczne dla typu, ponieważ późniejszy dereferencja wskaźnika (np. sizeof(*p_arr)) w każdym razie daje również błąd w C?

+0

Jaki późniejszy dereferencja? – ecatmur

+0

@ecatmur Zaktualizowano pytanie na przykład: – user1969104

+0

@ user2079303 Myślę, że pytanie w twoim linku dotyczy niekompletnego typu tablicy, ale nie dotyczy konwersji z kompletnego na niekompletny, w szczególności różnicę między 'c' i' C++ 'w tym zakresie. – user1969104

Odpowiedz

1

Konwersja sama w sobie jest bezpieczne, ale należy pamiętać, że ta sama zasada w C, który pozwala tej konwersji to pozwala również w odwrotnym kierunku.

int main() { 
    int array[4] = {0}; 
    int (*ptr4)[4] = &array; 
    int (*ptrN)[] = ptr4; 
    int (*ptr5)[5] = ptrN; /* oh dear */ 
} 

To jest wyraźnie złe. C++ usunęło tę regułę, reguła mówiąca, że ​​int[4] i int[] są zgodnymi typami i całkiem pozbyła się pojęcia kompatybilnego typu.

Niektóre określone konwersje, które są bezpieczne are being considered for inclusion in a future version of C++. Obejmują one także twoją konwersję.

0

Tak, to zadanie naprawdę nie jest bezpieczne.

W C++ typy tablic zawierają ten wymiar. Zawsze.

(w większości).

+0

Dlaczego jest to niebezpieczne, w przeciwieństwie do zwykłego niedozwolonego? (Oferuję również parametry niekompletnego typu tablicowego jako kontrprzykładu.) –

+0

@AlanStokes: Jest to niebezpieczne, dlatego nie jest dozwolone. Czy mógłbyś pokazać mi przykład jednego z tych "parametrów niekompletnego typu tablicy"? –

+0

'void f (int p []);' –

Powiązane problemy