0

我正在研究嵌入式代码并尝试将大量内存映射寄存器分配转换为 get()/set() 函数调用。我想知道是否有可能维护散布在整个代码中的地址分配,但更改#defines 以便它们将分配作为函数参数。

旧方式:

#define MOTOR_REG (*(volatile unsigned char *)(0xFEE002));  //a memory-mapped register
MOTOR_REG = value;        //sets value into the memory-mapped register

所需的新方式:

#define MOTOR_REG( set_motor_reg(value); )

void set_motor_reg(unsigned char)
{
   //logic to set the motor register
}

MOTOR_REG = value;       //value should be passed in to MOTOR_REG macro

那么,C 宏可以实现这种情况吗?谢谢你的想法!

4

2 回答 2

2

C 宏不允许您完全这样做,因为它们只是由预处理器完成的高级搜索和替换。但是,您可以将该值作为宏参数传递:

#define MOTOR_REG(value) set_motor_reg(value)

void set_motor_reg(unsigned char) { //logic to set the motor register }

MOTOR_REG(value); //value is passed in to MOTOR_REG macro

在上述情况下,当然不需要使用 MOTOR_REG,因为您可以直接调用 set_motor_reg。如果您被允许使用 C++,您可以通过运算符重载实现想要的行为。

于 2010-10-27T22:46:58.110 回答
1

你不能用宏做你想做的事。(您可以在 C++ 中使用运算符重载来执行此操作,但这可能不是一个选项)。

如果您想继续使用事物,就好像它们是变量一样,为什么要将所有内容都转换为函数?

于 2010-10-27T22:46:07.580 回答