c - 使用类 C 函数的宏作为函数别名

标签 c macros

我正在用 C 编写一个嵌入式应用程序,使用来自两个不同供应商的 SDK。每个 SDK 都有自己的模块来处理串行 (SPI) 功能,并且它们会相互干扰。我已经编写了自己的 SPI 模块,并希望改用我的函数。

我不想通过替换所有函数调用来修改 SDK,而是想使用类似函数的宏来使旧调用映射到新函数。

我的功能反射(reflect)了他们的功能,尽管有一个额外的参数来声明我正在与哪个设备通话。例如:

厂商的SDK函数声明:

NTRXSPIRead(uint8_t address, uint8_t *buffer, uint8_t len);

我的功能:

spiBurstRead(DEVICETYPE, uint8_t address, uint8_t *buffer, uint8_t len);

我提出的解决方案:

#define NTRXSPIRead(add,buff,len) spiBurstRead(DEVICETYPE,(add),(buff),(len))

这应该有效吗?有更好的方法吗?

最佳答案

我试过了,效果不错!这是一个更简单的函数作为示例,尽管问题中发布的函数也有效。

SDK 功能:

NTRXSPIWriteByte(uint8_t 地址,uint8_t 缓冲区);

我的功能:

void spiWriteByte (DEVICETYPE, uint8_t address, uint8_t byte2send);

#define 语句:

#define NTRXSPIWriteByte(add,buff) spiWriteByte(SPI_NANO,(add),(buff))

.

查看反汇编程序,直接调用该函数如下所示:

spiWriteByte (SPI_NANO, 0x01, 0xDB); // Address=0x01, Data 0xDB
LDI  R24,0x02  Load immediate // Note: "SPI_NANO" is enumerated as = 2
LDI  R22,0x01  Load immediate
LDI  R20,0xDB  Load immediate
CALL 0x00003519  Call subroutine

SDK调用:

NTRXSPIWriteByte (0x01, 0xDB);
LDI  R24,0x02  Load immediate
LDI  R22,0x01  Load immediate
MOV  R20,0xDB  Load immediate
CALL 0x00003519  Call subroutine

请注意,它将 DEVICETYPE 传递给目标函数,即使它在 SDK 中不存在。甜!

关于c - 使用类 C 函数的宏作为函数别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22179740/

相关文章:

使用信号和 sigsegjmp/siglongjmp 捕获 SIGSEGV

c - 当应用程序崩溃或被操作系统杀死时内存中会发生什么

c - 如何读取不同长度的子串

C++11嵌套宏调用?

macros - __impl 在宏模式中的意义是什么?

c - const char * 和 strdup 在 C 中与 getopt 一起使用时是否具有相同的功能?

c - 如何使用 CCS 检测 16 位溢出

c++ - #pragma 曾经是 C++11 标准的一部分吗?

macros - 在 rust macro_rules 中捕获生命周期

c - C宏中参数的变量号