【问题标题】:Possible to convert an address assignment to function argument via C macro?可以通过 C 宏将地址分配转换为函数参数吗?
【发布时间】:2010-10-27 22:40:27
【问题描述】:

我正在处理嵌入式代码并尝试将大量内存映射寄存器分配转换为 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 宏实现吗?感谢您的想法!

【问题讨论】:

  • 为什么要这样做?这段代码有什么问题?
  • @Adam Rosenfield - 我怀疑 OP 必须更新现有代码库以使用不同的代码来设置注册表值(可能首先添加一些验证)并且希望以最少的干预来完成。跨度>
  • @Franci Penov - 正确,如果可以简单地更改#define,我希望避免大量的查找+替换操作。

标签: c c-preprocessor memory-mapping


【解决方案1】:

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++,则可以通过运算符重载实现想要的行为。

【讨论】:

    【解决方案2】:

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

    如果你想继续像变量一样使用事物,为什么要把所有东西都转换成函数?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 2013-05-16
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 2012-11-13
      相关资源
      最近更新 更多