“ field”参数从何而来?

时间:2019-08-22 17:53:54

标签: c

我正在从事硬件RTL仿真项目。我想从使用C的现有固件中了解一些配置位的位置。但是,我无法理解某些语法。代码在头文件中,我不知道“ * field”和“ 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);         \
}

2 个答案:

答案 0 :(得分:1)

fieldval是参数。它们来自函数的签名,因此从字面上看,它们就是您传递给函数的任何内容。他们来自你...

答案 1 :(得分:0)

我认为__type__name__bit__width来自第一行(以{{1}开头) }),看起来像一个函数声明,但#definefield不是。

val不是函数声明,而是名为__BITFIELD(...)的{​​{3}}定义。

定义此宏后,您可以编写如下内容:

__BITFIELD

然后CPP将该宏扩展为“真实的” C代码,用上面的文字输入替换宏参数:

__BITFIELD(uint16_t, enable_counter, 4, 1)

然后将编译此代码。

因此,您最终将获得一个带有static inline uint16_t enable_counter(volatile const void *field) { volatile const uint16_t *ptr = field; return (*ptr >> (4)) & __BIT_MASK(uint16_t, 1); } ... 参数的函数。