2017-03-16 141 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