[英]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
. GPIOB
等switch ... case
將被優化。您還可以使用非常量參數調用它 - 這是宏無法做到的。
避免像斑塊這樣的宏。
以下應該工作:
#define __HAL_DHT_CLK_ENABLE_(DHT_GPIO_Port) __HAL_RCC_## DHT_GPIO_Port ##_CLK_ENABLE()
例如以下行:
__HAL_DHT_CLK_ENABLE(GpioA)
產生:
__HAL_RCC_GpioA_CLK_ENABLE()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.