2017-03-16 69 views
6

Rozważmy tę strukturę:Jak nazwać pola bez nazwy w strukturze C?

struct { 
    int a; 
    int _reserved_000_[2]; 
    int b; 
    int _reserved_001_[12]; 
    int c;  
}; 

Zarezerwowane pola nie powinny być odczytywane lub zapisywane. Moja struktura reprezentuje deskryptor adresujący FPGA, gdzie mam wiele pól reserved. Ostatecznie nazwałem je losowo, ponieważ po latach wstępna numeracja nic już nie znaczy.

Więc mam teraz:

struct { 
    int a; 
    int _reserved_3hjdds1_[2]; 
    int b; 
    int _reserved_40iuljk_[12]; 
    int c;  
}; 

Byłoby wygodniej mieć zamiast tylko puste pola:

struct { 
    int a; 
    int; 
    int b; 
    int; 
    int c;  
}; 

Ale to nie działa.

Jaką inną alternatywę mogę uniknąć znalezienia unikatowej nazwy dla pól reserved?

+1

Napisz generator kodu, za pomocą którego utworzysz deklaracje struktury. Pozwól mu tworzyć kolejno numerowane nazwy zarezerwowanych członków. Zwróćcie uwagę w szczególności, że nie ma znaczenia, czy nazwy zarezerwowanych członków ulegną zmianie, ponieważ nikt nie powinien mieć dostępu do tych członków. –

+0

Masz na myśli coś takiego jak "zarezerwowany _ ## __COUNTER__' – nowox

+0

Ponieważ nikt nie powinien używać zarezerwowanych pól, nie widzę, jak ważne jest to, czy początkowa numeracja rosnąco ma sens - jest używana tylko w celu uniknięcia nazw. Utknąłem z pierwszą wersją ... – Dmitri

Odpowiedz

3

Powinno być możliwe, aby osiągnąć to, co chcesz z odrobiną magii makro:

#include <stdint.h> 

#define CONCAT(x, y) x ## y 
#define EXPAND(x, y) CONCAT(x, y) 
#define RESERVED EXPAND(reserved, __LINE__) 

struct 
{ 
    uint32_t x; 
    uint32_t RESERVED; 
    uint16_t y; 
    uint64_t RESERVED[10]; 
} s; 

Daje to identyfikatory takie jak reserved11, reserved13, ale nazwiska oczywiście nie ma znaczenia.

+0

Niezła próba, ale nadal wolę moją [odpowiedź] (http://stackoverflow.com/a/42838409/2612235=) z makrami CAPITAL i ostrzeżeniem o '__COUNTER__'. Zapomniałeś również "#include ". – nowox

+1

@nowox '__LINE__' jest standardem C,' __COUNTER__' nie jest. – Lundin

+1

Zauważ, że '__LINE__' nie zadziała, jeśli masz wiele definicji w tym samym wierszu, ale przynajmniej otrzymasz błąd z kompilatora. Nadal uważam, że jest to lepsze niż '__COUNTER__'' – nowox