2017-03-16 51 views
6

en bu yapıyı düşünelim:C yapısında adlandırılmamış alanlar nasıl adlandırılır?

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

saklıdır alanlar okumak veya yazılı hiçbir zaman. Yapmam, bir çok reserved alanım olduğu bir FPGA'yı adreslemek için bir tanımlayıcıyı temsil ediyor. Sonunda onları rastgele isimlendirdim çünkü yıllar sonra ilk artan numaralandırma artık bir anlam ifade etmiyor.

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

yerine sadece boş alanları olması daha uygun olacaktır:

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

Ama çalışmıyor

Yani şimdi var.

Sadece bu reserved alanları için benzersiz bir ad bulmaktan başka hangi alternatifi kullanabilirim?

+1

Yapı bildirimlerini üretmek için bir kod üreteci yazın. Ayrılmış üyeler için sıralı numaralar oluştursun. Özellikle, üyelerin isimlerinin değişip değişmediğinin önemi yoktur, çünkü bu üyelere kimsenin erişmemesi gerekiyor. –

+0

"Reserved _ ## __COUNTER__' – nowox

+0

" gibi bir şeyden mi bahsediyorsunuz? Hiç kimse ayrılmış alanları kullanması gerekmediğinden, ilk artan artan numaralamanın anlamlı olup olmadığını anlamıyorum - sadece adları benzersiz kılmak için kullanılır. İlk versiyona takılıp kaldım ... – Dmitri

cevap

3

Size makro büyü biraz istediğini elde etmek mümkün olmalıdır: Bu, böyle reserved11, reserved13 olarak tanımlayıcıları verir ama isimleri belli ki önemli değil

#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; 

.

+0

Güzel deneme, ama yine de [answer] (http://stackoverflow.com/a/42838409/2612235=) CAPITAL makroları ve '__COUNTER__' ile ilgili uyarıyı tercih ediyorum. Ayrıca #include 'ununu da unutmuştunuz. – nowox

+1

@nowox '__LINE__' standart C,' __COUNTER__' değildir. – Lundin

+1

Aynı satırda birden çok tanımınız varsa '__LINE__' işlevinin çalışmaz, ancak en azından derleyiciden bir hata alırsınız. Hala bunun __COUNTER__' – nowox