REG,#-6ren">
gpt4 book ai didi

c - IAR编译器警告: "macro does not create a valid token"

转载 作者:行者123 更新时间:2023-11-30 15:08:46 25 4
gpt4 key购买 nike

我用 C 语言编写了以下宏:

#define __HAL_CLK_ENABLE(CONTROL_STRUCT,REG,CLK) do { \
SET_BIT(CONTROL_STRUCT->REG,##CONTROL_STRUCT##_##REG##_##CLK##EN);\
} while(0)

ma​​in.c 中的宏调用/所有参数均在 cpu 特定头文件中定义:

__HAL_CLK_ENABLE(RCC,AHB1ENR,GPIOA);

结果应该是:

SET_BIT(RCC->AHB1ENR,RCC_AHB1ENR_GPIOAEN)

该宏可以正常工作并正确启用我的 GPIOA 端口,但我收到两个编译器警告。 (IAR EW 7.6)

  1. 宏参数“CONTROL_STRUCT”可用于扩展形式和原始形式。(我会忽略这个警告,因为在这种情况下使用两种形式都是正确的!)

2。与宏“__HAL_CLK_ENABLE”中的“RCC_AHB1ENR_GPIOAEN”串联不会创建有效 token 。(这是什么意思?因为调用这个宏后 token 工作正常并且我的时钟启用)

谢谢

编辑1:

宏定义:

#define SET_BIT(REG, BIT)     ((REG) |= (BIT))

#define RCC ((RCC_TypeDef *) RCC_BASE)

typedef struct
{
...
__IO uint32_t AHB1ENR;
...
} RCC_TypeDef;

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

最佳答案

“# 和 ## 运算符的求值顺序未指定。” (ISO C99/C11 6.10.3.2、6.10.3.3)这意味着宏可能会在一个编译器上不符合程序员的意图,但在另一个编译器上却不会。

就您而言,这并不是什么大问题,正如 Ouss4 提到的那样,MISRA-C 建议不要使用多个 # 或 ## 运算符,主要是为了避免混淆(因此它只是一个建议指南)。

但是,如果 ## 操作导致无效标记,则多个 ## 运算符可能会导致未定义的行为,这就是 IAR 所警告的内容。 MISRA-C 论坛 "Rule 19.12 (# and ## operator) real issue?” 讨论了这个简单的示例。 :

define m(a,b) a##.##b

m(1,e30)

which is defined behavior on a left-to-right evaluation but undefined behavior on right-to-left because .e30 is two preprocessing tokens.

关于c - IAR编译器警告: "macro does not create a valid token",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37156658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com