gpt4 book ai didi

C 预处理 : pasting valid token and value of a token

转载 作者:行者123 更新时间:2023-11-30 17:29:49 26 4
gpt4 key购买 nike

我正在使用 STM32F1 微 Controller ,为其提供了一个 header ,用于定义寄存器的位掩码和值,如下所示:

#define RCC_CFGR_PLLMULL    //Mask of PLL multiplier setting bits
#define RCC_CFGR_PLLMULL1 //Value of PLL multiplier bits for PLL x1
#define RCC_CFGR_PLLMULL2 //Value of PLL multiplier bits for PLL x2
#define RCC_CFGR_PLLMULL3 //Value of PLL multiplier bits for PLL x3

等等等等

我想要做的是将我的 PLL 乘法器定义为一个整数,这样我就可以用它来导出时钟值 - 即 PLLCLK = IN_CLK * PLL_MULT - 并将该值粘贴到 RCC_CFGR_PLLMULL 上以获得正确的设置位。我通常为此使用的宏如下:

#define APPEND_VAL_HELPER(A, B)   A##B
#define APPEND_VAL(A, B) APPEND_VAL_HELPER(A,B)

然后,如果我将 SOME_NUM 定义为 123:

#define FOO                       APPEND_VAL(BAR, SOME_NUM)

结果 FOO 定义为 BAR123 。通常这是有效的。问题是:在本例中,RCC_CFGR_PLLMULL 在粘贴之前是有效的 token 。这导致它在 APPEND_VAL 的调用中扩展,我得到类似 ((uint32_t)0x003C0000)123 的东西。我无法弄清楚如何在不扩展 B 的情况下扩展 A ,至少在 GCC 中是这样。有解决方法,但我正在寻找一个干净的解决方案。存在吗?

最佳答案

我不确定您会认为什么是“干净”的解决方案,但这对我有用,而且看起来还不错:

/* target header */
#define RCC_CFGR_PLLMULL 0x003C
#define RCC_CFGR_PLLMULL1 0x0003

/* pasting macros */
#define APPEND_VAL_HELPER(A, B) A ## B
#define APPEND_VAL(A, B) APPEND_VAL_HELPER(A, B)
#define RCC_CFGR(T, N) APPEND_VAL(RCC_CFGR_, APPEND_VAL(T, N))

例如,您可以使用它,

#define FOO RCC_CFGR(PLLMUL, 1)

你也可以这样做

#define BAR RCC_CFGR(PLLMUL, )

BAR定义为RCC_CFGR_PLLMUL(无尾部)。

显然,这是特定于可能的目标宏的子集,但它完成了工作并且读取干净。据我所知,没有办法编写一个完全通用的标记粘贴宏——那些最通用的宏会遇到诸如您所描述的问题。

关于C 预处理 : pasting valid token and value of a token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25491991/

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