繁体   English   中英

从北欧半导体库了解编写预处理器指令的方法

[英]Understanding Methods of Writing Preprocessor Directives from Nordic Semiconductor Library

我正在努力了解 Nordic 的嵌入式系统计时器库。 我发现他们以一种我不理解且以前从未见过的方式定义预处理器指令:

/** @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_tnrf_timer_mode_tnrf_timer_bit_width_t都是枚举。

任何帮助理解这里发生的事情将不胜感激,谢谢!

它与宏语法或预处理器指令无关。 它是一个指定的初始化器,并且自 ISO C99 以来一直是 C 语言的一部分。

在这种情况下,用例将实例化一个类型为 nrfx_timer_config_t 的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, \

...点运算符 ( . ) 的左侧不能是类型名称,它必须是 object。 该宏用于初始化这样的 object(在=的 lhs 上)

关于:

我猜( nrf_timer_frequency_t )以某种方式表示成员资格,

不,这正是它的样子,一个常规的类型转换。 如果NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY如果枚举 nrf_timer_frequency_t 的枚举符号(或扩展为一个的宏),则nrf_timer_frequency_t是不必要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM