用C中的宏替换具有常量字符串参数的函数
在我工作的一个项目中,我们有一些实用函数,它有两个参数,一个是要写入的地址,另一个是要写入的值 让我们用一个简单的例子:用C中的宏替换具有常量字符串参数的函数,c,macros,C,Macros,在我工作的一个项目中,我们有一些实用函数,它有两个参数,一个是要写入的地址,另一个是要写入的值 让我们用一个简单的例子: enum { ADDR1 = 0x1000, ADDR2 = 0x1500, .... }; void Hardware_write_reg(ADDR,val) { switch ADDR { case ADDR1 : abc.x = val; break; case ADDR2 : abc.f = val; break; ..... ..... } 该函数“Hardwa
enum {
ADDR1 = 0x1000,
ADDR2 = 0x1500,
....
};
void Hardware_write_reg(ADDR,val)
{
switch ADDR {
case ADDR1 : abc.x = val; break;
case ADDR2 : abc.f = val; break;
.....
.....
}
该函数“Hardware_write_reg”在整个项目的许多文件中多次被调用,使用不同的ADDR和值作为参数
现在,我需要删除对“Hardware\u write\u reg”的调用,并直接写入结构成员。
例如,需要更改下面的Function1()
更改前:
Function1()
{
Hardware_write_reg(ADDR1,val1);
Hardware_write_reg(ADDR2,val4);
Hardware_write_reg(ADDR7,val6);
.....
}`
变更后:
Function1()
{
abc.x = val1;
abc.f = val4;
abc.s = val6;
.....
}
我无法手动执行此操作,因为在多个文件中有许多对Hardware_write_reg()的调用
我试着用C宏,像这样;但未能达到预期效果
#define Hardware_write_reg(ADDR1,A) do{\
abc.x = ((A));\
}while(0)
#define Hardware_write_reg(ADDR2,B) do{\
abc.f = ((B));\
}while(0)
基本上,我想替换(在编译时)
任何来自C-Guru的帮助都将不胜感激 在这种情况下,我唯一能想到的是将赋值操作放入switch语句中
#define Hardware_write_reg(ADDR,A) do{\
switch((ADDR)) { \
case ADDR1: abc.x = ((A));\
case ADDR2: abc.f = ((A));\
...
} \
} while(0)
在这种情况下,我唯一能想到的是将赋值操作放到switch语句中
#define Hardware_write_reg(ADDR,A) do{\
switch((ADDR)) { \
case ADDR1: abc.x = ((A));\
case ADDR2: abc.f = ((A));\
...
} \
} while(0)
在这种情况下,我唯一能想到的是将赋值操作放到switch语句中
#define Hardware_write_reg(ADDR,A) do{\
switch((ADDR)) { \
case ADDR1: abc.x = ((A));\
case ADDR2: abc.f = ((A));\
...
} \
} while(0)
在这种情况下,我唯一能想到的是将赋值操作放到switch语句中
#define Hardware_write_reg(ADDR,A) do{\
switch((ADDR)) { \
case ADDR1: abc.x = ((A));\
case ADDR2: abc.f = ((A));\
...
} \
} while(0)
您可以尝试正则表达式替换,而不是通过编程来解决这个问题,它包含在当今大多数文本编辑器中。但这里的问题是,对于switch中的每一种情况,您都必须修改一点regex。您的代码中不应该有任何其他硬件\u write\u reg 搜寻 硬件写入寄存器(ADDR1,val([0-9]+) 取代 abc.x=val\1
另外,如果您有很多情况,您可以生成正则表达式并用一个小脚本替换它。您可以尝试正则表达式替换,而不是通过编程解决这个问题,它包含在当今大多数文本编辑器中。但这里的问题是,对于switch中的每一种情况,您都必须修改一点regex。您的代码中不应该有任何其他硬件\u write\u reg 搜寻 硬件写入寄存器(ADDR1,val([0-9]+) 取代 abc.x=val\1
另外,如果您有很多情况,您可以生成正则表达式并用一个小脚本替换它。您可以尝试正则表达式替换,而不是通过编程解决这个问题,它包含在当今大多数文本编辑器中。但这里的问题是,对于switch中的每一种情况,您都必须修改一点regex。您的代码中不应该有任何其他硬件\u write\u reg 搜寻 硬件写入寄存器(ADDR1,val([0-9]+) 取代 abc.x=val\1
另外,如果您有很多情况,您可以生成正则表达式并用一个小脚本替换它。您可以尝试正则表达式替换,而不是通过编程解决这个问题,它包含在当今大多数文本编辑器中。但这里的问题是,对于switch中的每一种情况,您都必须修改一点regex。您的代码中不应该有任何其他硬件\u write\u reg 搜寻 硬件写入寄存器(ADDR1,val([0-9]+) 取代 abc.x=val\1
另外,如果您有许多情况,您可以生成正则表达式并用一个小脚本替换。因为C宏无法在编译时猜测ADDR的值,因此无法为每个ADDR放置适当的结构成员 根据需要,用实际赋值语句替换函数调用。因此,似乎唯一可以做到这一点的方法是在代码中查找/替换。为此,您可以编写一个正则表达式并使用它查找替换。例如,对于ADDR1: 查找正则表达式:
(硬件写入注册)[(](ADDR1)[,]([\w]*)[)]代码>
并将其替换为:
abc.x=$3代码>
上述正则表达式在eclipse中是兼容的,因为C宏在编译时无法猜测ADDR的值,因此无法为每个ADDR放置适当的结构成员
根据需要,用实际赋值语句替换函数调用。因此,似乎唯一可以做到这一点的方法是在代码中查找/替换。为此,您可以编写一个正则表达式并使用它查找替换。例如,对于ADDR1:
查找正则表达式:
(硬件写入注册)[(](ADDR1)[,]([\w]*)[)]代码>
并将其替换为:
abc.x=$3代码>
上述正则表达式在eclipse中是兼容的,因为C宏在编译时无法猜测ADDR的值,因此无法为每个ADDR放置适当的结构成员
根据需要,用实际赋值语句替换函数调用。因此,似乎唯一可以做到这一点的方法是在代码中查找/替换。为此,您可以编写一个正则表达式并使用它查找替换。例如,对于ADDR1:
查找正则表达式:
(硬件写入注册)[(](ADDR1)[,]([\w]*)[)]代码>
并将其替换为:
abc.x=$3代码>
上述正则表达式在eclipse中是兼容的,因为C宏在编译时无法猜测ADDR的值,因此无法为每个ADDR放置适当的结构成员
根据需要,用实际赋值语句替换函数调用。因此,似乎唯一可以做到这一点的方法是在代码中查找/替换。为此,您可以编写一个正则表达式并使用它查找替换。例如,对于ADDR1:
查找正则表达式:
(硬件写入注册)[(](ADDR1)[,]([\w]*)[)]代码>
并将其替换为:
abc.x=$3代码>
上面的正则表达式在eclipse中是兼容的您可以定义一组宏
#define target_ADDR1 abc.x
#define target_ADDR2 abc.f
#define CONCAT2(a, b) a##b
#define Hardware_write_reg(ADDR,val) CONCAT2(target_,ADDR) = val
所以
Hardware_write_reg(ADDR1,42);
被替换为
target_ADDR1 = 42;
因此
abc.x = 42;
这就是你得到的
免责声明:我还没有测试过它,但我非常确定