2012-07-04 27 views
8

Użyłem bitowe pole o strukturze jak ta,Czy użycie pól bitowych w połączeniu jest prawidłowe?

struct 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

Teraz ja zastanawiałem się, czy można to zrobić z unii więc zmodyfikowany kod podobnego,

union 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

znalazłem bit field z pracami związkowymi, ale wszystkie te pola w unii są podane jednemu bitowi, tak jak to rozumiałem z wyjścia. Teraz widzę, że nie jest błędem używać pól bitowych ze złączem, ale wydaje mi się, że używanie go w ten sposób nie jest poprawne operacyjnie. Tak więc jaka jest odpowiedź - czy ważne jest użycie pola bitowego z połączeniem?

+0

proszę, co nie działa prawidłowo? – alk

Odpowiedz

12

Otrzymujesz broń i kule. Czy to jest w porządku, aby strzelić sobie z tym pieszo? Oczywiście, że nie, ale nikt nie może powstrzymać cię przed zrobieniem tego, jeśli chcesz.

Chodzi mi o to, że podobnie jak broń i pociski, pola połączone i bitowe są narzędziami i mają swój cel, zastosowanie i "nadużycia". Tak więc używanie bitfieldów w zjednoczeniu, jak napisałeś powyżej, jest całkowicie poprawnym C, ale bezużytecznym kawałkiem kodu. Wszystkie pola wewnątrz unii mają tę samą pamięć, więc wszystkie wspomniane bitfy są w zasadzie tą samą flagą, ponieważ mają wspólną pamięć.

12

Jest ważny, ale jak się dowiedziałeś, nie jest tak użyteczny, jak tam to zrobiłeś.

Możesz zrobić coś takiego, aby móc zresetować wszystkie bity w tym samym czasie przy użyciu flag.

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    unsigned int flags; 
}; 

Albo można zrobić coś takiego:

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    struct { 
     unsigned int is_ready: 1; 
     unsigned int is_done: 1; 
     unsigned int is_waiting: 1; 
    }; 
}; 
+1

Dodałem kilka średników zakładając, że chciałeś anonimowych struktur. Zauważ, że nie są one standardem C. W gcc, musisz użyć '-fms-extensions', aby działały. – unkulunkulu