簡體   English   中英

C 中的一級宏擴展

[英]One level macro expansion in C

我在一個庫中工作,該庫是其他庫的接口,具有多個定義的宏,例如:

#define GPIOx  some stuff
#define __HAL_RCC_GPIOx_CLK_ENABLE() some other stuff

其中 x 是一個字母 (A,B,C,...)。

我不能改變這些宏(或者我不應該改變它們,因為它們被其他組件使用)。

在我正在工作的庫中,我試圖定義一些用戶可以修改的其他宏,例如:

#define DHT_GPIO_Port  GPIOx

我想定義一個宏,它使用這樣的定義來生成另一個宏名稱:

#define __HAL_DHT_CLK_ENABLE(DHT_GPIO_Port)  __HAL_RCC_## DHT_GPIO_Port ##_CLK_ENABLE()

這是因為我想為我的庫使用宏而不是 __HAL_RCC_GPIOx_CLK_ENABLE() 因為它會根據用戶定義的 GPIO 不同而不同。

但是,當我嘗試使用我的 __HAL_DHT_CLK_ENABLE(DHT_GPIO_Port) 宏時,它會擴展為 __HAL_RCC_DHT_GPIO_Port_CLK_ENABLE(),而不是 __HAL_RCC_GPIOx_CLK_ENABLE()。

另一方面,我嘗試將它放在另一個宏中,但是它也擴展了我不需要的 GPIOx。

也許,這是一個初學者的問題,但是您能幫助在其他宏連接中僅擴展宏 DHT_GPIO_Port 的第一級嗎?

這沒有太大意義。 使用內聯函數代替無用的難以閱讀的宏

#define SINLINE static inline __attribute__((always_inline))

SINLINE void  __HAL_DHT_CLK_ENABLE(GPIO_TypeDef * const gpio)
{
    switch((uint32_t)gpio)
    {
        case (uint32_t)GPIOA:
            __HAL_RCC_GPIOA_CLK_ENABLE();
            break;
        case (uint32_t)GPIOB:
            __HAL_RCC_GPIOA_CLK_ENABLE();
            break;
        case (uint32_t)GPIOC:
            __HAL_RCC_GPIOA_CLK_ENABLE();
            break;
    }
}

當您啟用優化並使用常量表達式調用它時(如GPIOA . GPIOBswitch ... case將被優化。您還可以使用非常量參數調用它 - 這是宏無法做到的。

避免像斑塊這樣的宏。

以下應該工作:

#define __HAL_DHT_CLK_ENABLE_(DHT_GPIO_Port)  __HAL_RCC_## DHT_GPIO_Port ##_CLK_ENABLE()

定義 __HAL_DHT_CLK_ENABLE(DHT_GPIO_Port) __HAL_DHT_CLK_ENABLE_(DHT_GPIO_Port)

例如以下行:

__HAL_DHT_CLK_ENABLE(GpioA)

產生:

__HAL_RCC_GpioA_CLK_ENABLE()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM