如果我可以使用#define指向一个函数,我有点困惑。我有一个编解码器/ DSP,他的工具会自动生成这样的代码页:
SIGMA_WRITE_REGISTER(address, data, length);
SIGMA_WRITE_REGISTER(address, data, length);
SIGMA_WRITE_REGISTER(address, data, length);
....
然后在另一个.h文件中,他们这样做:
#define SIGMA_WRITE_REGISTER( address, data, length ) {
/*TODO: implement macro or define as function*/}
这对于编写寄存器没有任何帮助。这很好,虽然为我的micro编写了一些代码,通过I2C编写寄存器,这似乎是有效的。现在我不想只将该代码粘贴到上面的定义中,并让它实例化1000次。我希望我可以使用is define作为我的函数的别名吗?
类似的东西:
#define SIGMA_WRITE_REGISTER(address, data, length) { my_i2_c_func(address, data, length)}
我尝试了这样的东西并且编译了,但我不确定它是否正常工作。这是一件有效的事吗,还是我在咆哮错误的树?
答案 0 :(得分:4)
是的,您肯定可以使用#define
指向完整的功能或别名。
考虑下面一个更简单的例子,仅用于理解
#define STRLEN(x) my_strlen(x)
和
int my_strlen(char *p)
{
// check for NULL pointer argument?
int x;
for (x = 0; *p++; x++);
return x;
}
现在,在您的代码中,您可以根据需要使用STRLEN
。
注意:关于{ }
的存在,您可以删除它们,或使用do..while
循环,或将该函数定义为宏本身的一部分。选择是你的。但是,由于MACRO在预处理阶段[类似于文本替换]进行了扩展,因此您需要对{}
和;
用法格外小心。 MACRO的使用不应该破坏代码。
答案 1 :(得分:2)
它(几乎)有效,但在最后一个闭括号之后和闭括号之前你需要一个分号。
替换中的大括号完全是多余的,所以无论如何你都要删除它们,然后你就不需要刚才添加的分号了。大括号在每个语句块之后给出一个空语句(如果你在宏中保留分号,你也会在每次宏调用后得到一个空语句。
.h
文件中的注释表明您可以使用函数(调用)替换宏。你正在做的事情基本上没问题。
答案 2 :(得分:0)
#define SIGMA_WRITE_REGISTER my_i2_c_func