C使用#define指向或别名功能

时间:2014-12-23 20:28:40

标签: c embedded

如果我可以使用#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)}

我尝试了这样的东西并且编译了,但我不确定它是否正常工作。这是一件有效的事吗,还是我在咆哮错误的树?

3 个答案:

答案 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