我有一个从串行线读取数据并对其进行处理的函数,简化了:
void serialData(int port){
static uint8_t byte;
static uint8_t store[];
//read one byte from specified port
//store this byte in the array
//process the data
}
我需要在“乒乓”系统中从两条不同的串行线路读取数据,并对每一条线路以相同的方式处理数据。
while (true){
serialData(port1);
serialData(port2);
}
这不起作用,因为在每个后续调用中,来自端口1和端口2的数据都会混合到数组中。
我只想输入一次该函数的代码,然后以某种方式使用两个不同的名称引用该代码,以便变量不会干扰,除了复制/粘贴具有新名称的相同代码之外,还有更好的解决方案吗?
我尝试过#define,例如:
#define port1Data serialData
#define port2Data serialData
和指针:
void (*port1Data) (int) = &serialData;
void (*port2Data) (int) = &serialData;
但是对两个重命名函数的连续调用仍然会干扰。
最佳答案
通常的方法是从函数中删除静态数据
#include <stdio.h>
int function(int n) {
static int foo = 0;
foo += n;
return foo;
}
int main(void) {
function(10); // returns 10
function(-4); // returns 6
printf("%d, %d\n", function(1), function(-1)); // UB; functions call mess with each other
}
见https://ideone.com/c1kW51
要删除静态数据,我会做类似的事情
#include <stdio.h>
struct fxdata {
int foo;
};
int function(int n, struct fxdata *p) {
p->foo += n;
return p->foo;
}
int main(void) {
struct fxdata f1 = {0};
struct fxdata f2 = {0};
function(10, &f1); // returns 10
function(-4, &f2); // returns -4
printf("%d, %d\n", function(1, &f1), function(-1, &f2));
}
见https://ideone.com/aePprq
关于c - 两次调用函数而不会干扰C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57397536/