【问题标题】:pass macro definition to function taking reference as an argument将宏定义传递给以引用为参数的函数
【发布时间】:2016-05-04 07:25:08
【问题描述】:

我们如何将#defined 宏作为函数接受引用的参数传递给函数。

这是我尝试错误的方式:

#define RST_REQ_REG 0x04
#define RESET_CMD   0x01

write_register(RST_REQ_REG, RESET_CMD, 1);


// Decleration of write_reg is
void write_register(uint8_t regAddr, uint8_t *writeByte, uint8_t writeByteLen);

谢谢!

【问题讨论】:

  • write_register 接受 pointer 作为第二个参数。但 RESET_CMD 不是指针。您需要一个 1 字节的缓冲区,其中填充有 RESET_CMD

标签: c macros arm atmelstudio


【解决方案1】:

你不能。 write_register 接受 指针 作为第二个参数,句点。

你可能想要这个:

#define RST_REQ_REG 0x04
#define RESET_CMD   0x01

uint8_t cmdbuffer[1] = {command};

write_register(RST_REQ_REG, cmdbuffer, 1);

也许你想把它包装到另一个函数中:

void write_command(uint8_t regAddr, uint8_t command)
{
   uint8_t cmdbuffer[1] = {command};
   write_register(regAddr, cmdbuffer, 1);
}

...
write_command(RST_REQ_REG, RESET_CMD);

【讨论】:

    【解决方案2】:

    由于您必须将指针传递给 write_register 函数,因此您必须先将其分配给一个变量,以便为它分配存储空间。它不能作为文字传递。为什么 write_register 需要一个指针,可能是如果你想写入多个字节,那么你可以传递一个数组(C 中的数组只是指向数组第一个元素的指针),但是如果你总是想写入 1 个字节可能会很烦人。

    所以你需要做这样的事情:

    uint8_t byteToWrite = RESET_CMD;
    write_register(RST_REQ_REG, &byteToWrite, 1);
    

    如果这种情况经常发生并且让您烦恼,您可以编写一个包装函数:

    static void my_write_register(uint8_t regAddr, uint8_t writeByte)
    {
      write_register(regAddr, &writeByte, 1);
    }
    

    那么你可以这样称呼它:

    my_write_register(RST_REQ_REG, RESET_CMD);
    

    【讨论】:

    • 是的,我通常传递一个数组,因此我相应地创建了函数,并且只发送一个字节,我所做的与您最初建议的完全相同。提醒指针需要内存。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多