Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “在哪里?”;“字段”;参数来自哪里?_C - Fatal编程技术网

C “在哪里?”;“字段”;参数来自哪里?

C “在哪里?”;“字段”;参数来自哪里?,c,C,我正在从事一个硬件RTL模拟项目。我想知道一些配置位的位置,从现有的固件与C。然而,我不能理解一些语法。代码在一个头文件中,我不明白“*字段”和“val”来自哪里 #define __BITFIELD(__type, __name, __bit, __width) \ static inline __type __name(volatile const void *field) \ {

我正在从事一个硬件RTL模拟项目。我想知道一些配置位的位置,从现有的固件与C。然而,我不能理解一些语法。代码在一个头文件中,我不明白“*字段”和“val”来自哪里

#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)
,这是一个定义两个函数的宏。