我正在努力理解北欧的嵌入式系统定时器库。我发现它们定义预处理器指令的方式是我不理解的,也是我以前从未见过的:
/** @brief The configuration structure of the timer driver instance. */
typedef struct
{
nrf_timer_frequency_t frequency; ///< Frequency.
nrf_timer_mode_t mode; ///< Mode of operation.
nrf_timer_bit_width_t bit_width; ///< Bit width.
uint8_t interrupt_priority; ///< Interrupt priority.
void * p_context; ///< Context passed to interrupt handler.
} nrfx_timer_config_t;
/** @brief Timer driver instance default configuration. */
#define NRFX_TIMER_DEFAULT_CONFIG \
{ \
.frequency = (nrf_timer_frequency_t)NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,\
.mode = (nrf_timer_mode_t)NRFX_TIMER_DEFAULT_CONFIG_MODE, \
.bit_width = (nrf_timer_bit_width_t)NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH,\
.interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY, \
.p_context = NULL \
}我不理解的是他们的预处理器指令#define NRFX_TIMER_DEFAULT_CONFIG中的符号。点运算符用于访问结构成员,但是点左边没有任何内容,那么编译器如何知道要访问哪个结构呢?我希望是这样的:
nrfx_timer_config_t.frequency = NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY, \但是没有对nrfx_timer_config_t结构的引用。我猜(nrf_timer_frequency_t)是在以某种方式表示成员资格,但我不明白它是如何做到这一点的,因为.interrupt_priority和.p_context似乎根本没有任何对nrfx_timer_config_t结构的引用。编译器如何知道这些值来自哪里以及如何赋值?
此外,我不确定是否需要此上下文,但nrf_timer_frequency_t、nrf_timer_mode_t和nrf_timer_bit_width_t都是枚举。
如果能帮助我们理解这里发生的事情,我们将不胜感激,谢谢!
发布于 2021-05-22 01:15:13
它与宏语法或预处理器指令无关。它是一种,自ISO C99以来一直是C语言的一部分。
在本例中,用例将实例化一个nrfx_timer_config_t类型的对象,并使用NRFX_TIMER_DEFAULT_CONFIG对其进行初始化,如下所示:
nrfx_timer_config_t timer1 = NRFX_TIMER_DEFAULT_CONFIG ;它扩展为:
nrfx_timer_config_t timer1 = {
.frequency = (nrf_timer_frequency_t)NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,
.mode = (nrf_timer_mode_t)NRFX_TIMER_DEFAULT_CONFIG_MODE,
.bit_width = (nrf_timer_bit_width_t)NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH,
.interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY,
.p_context = NULL
};(忽略NULL和任何其他宏也将被展开的事实)。
关于:
我希望是这样的:
nrfx_timer_config_t.frequency = NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,\
..。点运算符(.)的左侧不能是类型名称,它必须是对象。宏用于初始化这样的对象(在=的lhs上)
关于:
我猜(
nrf_timer_frequency_t)以某种方式表示成员资格,
不,这就是它看起来的样子,一个常规的类型转换。如果为NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY、枚举nrf_timer_frequency_t的枚举符号(或扩展为1的宏),则不需要强制转换。
https://stackoverflow.com/questions/67640975
复制相似问题