用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;
这就是你得到的

免责声明:我还没有测试过它,但我非常确定