2017-03-16 66 views
6

讓我們考慮這樣的結構:如何命名C結構中的未命名字段?

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

保留項應該永遠不會被讀取或寫入。我的結構代表了一個描述符來解決一個FPGA,在那裏我得到了很多reserved字段。我最終命名爲隨機命名,因爲多年以後,最初的升序編號並不意味着任何東西。

所以我現在有:

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

這將是剛剛空字段,而不是更方便:

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

但它不工作。

還有什麼其他的選擇可以避免爲reserved字段找到唯一的名稱?

+1

編寫一個用於生成結構聲明的代碼生成器。讓它爲保留的成員創建順序編號的名稱。特別要注意的是,保留成員的名稱是否改變並不重要,因爲沒有人應該訪問這些成員。 –

+0

你的意思是像'reserved _ ## __COUNTER__'這樣的東西 – nowox

+0

因爲沒有人應該使用保留字段,所以我不認爲最初的升序編號是否有意義是多麼重要 - 它只是用來使名稱獨一無二。我會堅持使用第一個版本...... – Dmitri

回答

3

應該可以達到你想要有一點的宏觀魔法是什麼:

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

這給你的標識符,例如reserved11reserved13,但名稱顯然並不重要。

+0

不錯的嘗試,但我仍然更喜歡我的[答](http://stackoverflow.com/a/42838409/2612235=)與CAPITAL宏和關於'__COUNTER__'的警告。你也忘了'#include '。 – nowox

+1

@nowox'__LINE__'是標準C,'__COUNTER__'不是。 – Lundin

+1

注意,如果你在同一行有多個定義,'__LINE__'將不起作用,但至少你會從編譯器中得到一個錯誤。我仍然認爲這比'__COUNTER__'更好# – nowox