gpt4 book ai didi

c - 有没有办法控制宏扩展顺序

转载 作者:行者123 更新时间:2023-12-01 12:00:33 25 4
gpt4 key购买 nike

我希望有人知道如何控制/指定宏扩展的顺序。这是上下文:


// 32 bit increments, processor has registers for set, clear and invert
#define CLR_OFF 1
#define SET_OFF 2
#define INV_OFF 3


#define SET(reg,bits) *((volatile unsigned long*)(& reg+SET_OFF)) = bits
//Now if I use this I can do it quite nicely with
#define STATUS_LED 0x0040;
SET(LATB, STATUS_LED); // LATB is port of the LED.

实际上我最近不得不多次移动硬件,所以我决定像这样将 LATB 信息与 STATUS_LED 分组......


#define STATUS_LED_PORT LATB
#define STATUS_LED_MASK 0x0040;
#define STATUS_LED STATUS_LED_PORT, STATUS_LED_MASK

//And I try to use it via
SET( STATUS_LED );

但是,LATB,0x0040 被传递给了 SET 宏的参数 1。当不用作宏时,此方法可以正常工作:


inline void SET(u32_t *reg, u32_t bits) { ((volatile u32_t *) (((u32_t)reg) + SET_OFF*4 )) = bits; }
//Change the STATUS_LED macro to
#define STATUS_LED &STATUS_LED_PORT, STATUS_LED_MASK
SET( STATUS_LED); //Works great!

但不幸的是,我的编译器没有看到需要内联该函数并导致 6 条指令来设置寄存器而不是 4 条,因此在使用位爆炸时它是不可预测的。

我希望有人可能知道一种首先扩展 STATUS_LED 宏的方法,例如:设置(##STATUS_LED)

目前我继续前进的解决方案是有两个宏 SET 和 SETRM(设置寄存器,掩码)但我觉得应该有一个解决方案,因为 SET 的代码看起来像......


#define SETRM(reg,bits) ...
#define SET(args) SETRM(args) //WHY WOULD THIS GET EXPANDED HERE??

最后,我的处理器的编译器不支持宏的 n 参数,我认为我可以使用它,但是唉 :(。

非常感谢您抽出宝贵的时间,如果有任何想法,我将不胜感激,我可以继续前进,但如果我可以在任何地方都使用 SET,它会更干净。

最佳答案

类函数宏扩展中的参数替换以固定方式发生。所有未出现在 # 运算符之后或 ## 任一侧的参数在被替换时都将被完全宏扩展,而不是在类函数宏被扩展之前.

这意味着要使单个宏成为两个宏参数,必须在扩展所需的函数(如宏)本身之前进行一轮宏替换。

这意味着扩展为所需的类函数宏的第二个函数类宏的解决方案是最简单的解决方案。

即给定您的原始 SET 定义

#define SET(reg,bits) *((volatile unsigned long*)(& reg+SET_OFF)) = bits

和一个扩展为两个潜在参数的宏

#define STATUS_LED_PORT LATB
#define STATUS_LED_MASK 0x0040;
#define STATUS_LED STATUS_LED_PORT, STATUS_LED_MASK

您必须使用另一个类似函数的宏来获得您需要的替换。

例如

#define SET2(x) SET(x)

然后 SET2( STATUS_LED ) 展开如下。

SET( LATB , 0x0040; )

然后

*((volatile unsigned long*)(& LATB + 2 )) = 0x0040;

这是无效的,因为 SET 宏没有足够的参数;在参数的任何扩展发生之前,参数与参数匹配。我的编译器产生错误;行为未定义。

SET( STATUS_LED )

关于c - 有没有办法控制宏扩展顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2202147/

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