C “在哪里?”;“字段”;参数来自哪里?
我正在从事一个硬件RTL模拟项目。我想知道一些配置位的位置,从现有的固件与C。然而,我不能理解一些语法。代码在一个头文件中,我不明白“*字段”和“val”来自哪里C “在哪里?”;“字段”;参数来自哪里?,c,C,我正在从事一个硬件RTL模拟项目。我想知道一些配置位的位置,从现有的固件与C。然而,我不能理解一些语法。代码在一个头文件中,我不明白“*字段”和“val”来自哪里 #define __BITFIELD(__type, __name, __bit, __width) \ static inline __type __name(volatile const void *field) \ {
#define __BITFIELD(__type, __name, __bit, __width) \
static inline __type __name(volatile const void *field) \
{ \
volatile const __type *ptr = field; \
return (*ptr >> (__bit)) & __BIT_MASK(__type, __width); \
} \
static inline void __name##_set(volatile void *field, __type val) \
{ \
volatile __type *ptr = field; \
*ptr &= ~(__BIT_MASK(__type, __width) << (__bit)); \
*ptr |= (val & __BIT_MASK(__type, __width)) << (__bit); \
}
#定义位字段(uuu类型、名称、位、宽度)\
静态内联类型名称(volatile const void*字段)\
{ \
volatile const _type*ptr=字段\
返回(*ptr>>(_位))&位掩码(_类型,_宽度)\
} \
静态内联void uu name 35;#u集(volatile void*字段,u类型val)\
{ \
挥发性u_类型*ptr=字段\
*ptr&=~(\u位\u掩码(\u类型,\u宽度)字段
和val
是参数。它们来自函数的签名,因此它们实际上就是你传递给函数的任何东西。它们来自你…我认为你被以下事实弄糊涂了:\uu type
,\uu name
,\uu bit
,和\uu width
来自第一行(以#define
开头)看起来像函数声明,但字段和val
不是
\uuu位域(…)
不是函数声明,而是名为\uu位域的定义
定义此宏后,可以编写如下内容:
__BITFIELD(uint16_t, enable_counter, 4, 1)
然后,CPP将该宏扩展为“真实”C代码,用上面输入的内容替换宏参数:
static inline uint16_t enable_counter(volatile const void *field)
{
volatile const uint16_t *ptr = field;
return (*ptr >> (4)) & __BIT_MASK(uint16_t, 1);
}
...
然后将编译此代码
因此,您将得到一个具有字段
参数的函数。如果没有上下文,我相信我们知道的比您知道的要少。此代码来自何处?标识符“field`来自函数参数\u name(volatile const void*field)
,这是一个定义两个函数的宏。