gpt4 book ai didi

c - 用 C 中的宏替换具有常量字符串参数的函数

转载 作者:太空宇宙 更新时间:2023-11-04 07:15:53 25 4
gpt4 key购买 nike

在我从事的一个项目中,我们有一些实用函数,它们接受两个参数,一个是要写入的地址,第二个是要写入的值。

让我们用一个简单的例子:

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_write_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)

基本上,我想替换(在编译时)

1) Hardware_write_reg(ADDR1,val1); function call to abc.x = val1; with a macro
2) Hardware_write_reg(ADDR2,val2); function call to abc.f = val2; with a macro
3)....

非常感谢 C-Guru 的任何帮助!

最佳答案

你可以定义一堆宏

#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;

就是你得到的。

免责声明:我还没有测试过,但我很确定这应该有效。

关于c - 用 C 中的宏替换具有常量字符串参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24695329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com