Zacząłem czytać Komentarz Lions na Unix v6. Natknąłem się na te fragmenty, których nigdy nie widziałem używane w języku C. Autor przedstawia jakieś wyjaśnienie, ale czy ktoś mógłby mi wyjaśnić, co tu się dzieje?Anonimowe struktury w C znalezione w jądrze Unix
params.h
:
SW 0177570
......
struct { int integ; };
i ten stosowany w unix/prf.c
if(SW->integ == 0)
wyjaśnienie przez autora
SW
jest zdefiniowany wcześniej jako wartość 0177570. Jest to adres jądra z tylko do odczytu rejestru procesora, który przechowuje ustawienie rejestru przełączników konsoli. Znaczenie instrukcji jest jasne: pobierz zawartość w lokalizacji 0177570 i sprawdź, czy są one zerowe. Problem polega na wyrażeniu tego w C. Kodif (SW == 0)
nie przekazałby tego znaczenia. OczywiścieSW
jest wartością wskaźnika, która powinna być z dereferencji. Kompilator mógł zostać zmieniony na , aby zaakceptowaćif (SW-> == 0)
, ale w obecnej formie jest to niepoprawne składniowo. Dzięki wymyśleniu pozornej struktury, z elementeminteg
, programista znalazł satysfakcjonujące rozwiązanie problemu z .
Moje pytanie dotyczy głównie tego, jak to działa? Kiedy kompilator widzi SW->integ
, w jaki sposób kojarzy on anonimową strukturę z SW
?
We współczesnym C używalibyśmy 'int * const SW = 0177570;' Ale przed pojawieniem się optymalizatorów, kosztowałoby to Kena i jego bandę kosztownymi dwoma bajtami :) –