Muszę zdefiniować 24-bitowy typ danych. Używam char[3]
do reprezentowania typu. Czy mogę napisać char[3]
na maszynie type24
? Próbowałem w próbce kodu. I umieścić typedef char[3] type24;
w moim pliku nagłówka. Kompilator nie narzekał na to. Ale kiedy zdefiniowałem funkcję void foo(type24 val) {}
w moim pliku C, narzekała. Chciałbym móc definiować funkcje takie jak type24_to_int32(type24 val)
zamiast type24_to_int32(char value[3])
.
210
type24 foo
, co byłoby rozmiary, typy i znaczeńfoo
,*foo
,**foo
,&foo
, i&&foo
? Czy znaczenia i legalność takich wyrażeń zmieniły się na przestrzeni lat?Chcesz
Deklaracje typu C są w ten sposób dziwne. Umieszczasz typ dokładnie tam, gdzie pójdzie nazwa zmiennej, jeśli deklarujesz zmienną tego typu.
źródło
Od R .. 's odpowiedź :
Użytkownicy, którzy nie widzą, że jest to tablica, najprawdopodobniej napiszą coś takiego (co się nie powiedzie):
Skompiluje się z następującymi ostrzeżeniami:
I produkuje następujące dane wyjściowe:
źródło
Tablice nie mogą być przekazywane jako parametry funkcji przez wartość w C.
Możesz umieścić tablicę w strukturze:
a następnie przekazać to przez wartość, ale oczywiście jest to mniej wygodne w użyciu:
x.byte[0]
zamiastx[0]
.Twoja funkcja
type24_to_int32(char value[3])
faktycznie przekazuje wskaźnik, a nie wartość. Jest dokładnie równoważnytype24_to_int32(char *value)
i3
jest ignorowany.Jeśli jesteś zadowolony przechodzącej przez wskaźnik, to mógł pozostać przy tablicy i zrobić:
Spowoduje to przekazanie wskaźnika do tablicy, a nie wskaźnika do pierwszego elementu, więc używasz go jako:
Nie jestem pewien, czy to naprawdę zysk, ponieważ jeśli przypadkowo napiszesz,
value[1]
dzieje się coś głupiego.źródło
decay
gdzieś tego terminu (i może przez wskazanie, że sytuacja jest gorsza w przypadku zwracania tablic - co wcale nie działa).Aby poprawnie użyć typu tablicy jako argumentu funkcji lub parametru szablonu, utwórz strukturę zamiast typedef, a następnie dodaj
operator[]
do struktury, aby zachować funkcjonalność podobną do tablicy:źródło
char&
też nieoperator[]
są rzeczy, które istnieją w C.Oto krótki przykład, dlaczego tablica typedef może być myląco niespójna. Pozostałe odpowiedzi stanowią obejście.
To daje wynik
ponieważ type24 jako parametr jest wskaźnikiem. (W C tablice są zawsze przekazywane jako wskaźniki). Kompilator gcc8 domyślnie wyświetli ostrzeżenie, na szczęście.
źródło