将宏定义传递给函数,将引用作为参数

时间:2016-05-04 07:25:09

标签: c macros arm atmelstudio

我们如何将#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);

谢谢!

2 个答案:

答案 0 :(得分:2)

你不能。 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);

答案 1 :(得分:1)

由于必须将指针传递给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);