需要帮助将C宏重写为函数

时间:2009-03-27 20:46:58

标签: c macros c-preprocessor

我需要一些帮助以更安全的方式重写以下行并将其重写为函数,但是这个代码在函数内定义的事实让我很难想到一个聪明的方法因为显然它会涉及声明几个论点。

#define CHECK(id) if(table->cells[id]) isgood[table->cells[id]-1] = 0;

其中tablestructisgoodint

6 个答案:

答案 0 :(得分:5)

直接翻译(如果table-> cells [id]为int):

void check(int id, int*isgood) { if (id) isgood[id-1] = 0; }

致电:

check(table->cells[id], isgood);

但是,我会重命名/重做这一点。我特别改名。也没有错误检查 - 即,如果table-> cells [id] == 0,你将尝试设置isgood [-1],这将是不好的。

答案 1 :(得分:4)

  显然它会涉及声明   几个论点

这有什么问题?

答案 2 :(得分:2)

为什么不只是一个接收tableid并执行此操作的函数?

void foo(TableType & t, int id)
{
    if (t.cells[id]) 
        isgood[t.cells[id]-1] = 0;
}

P.S。

这确实是一个糟糕的宏。这个名字非常具有误导性。

p.p.s。

整个事情相当奇怪,这个函数的逻辑逃脱了我。究竟应该达到什么目的?

答案 3 :(得分:2)

如果您正在使用C ++,我会考虑将检查作为表的成员函数,这似乎是一个很好的候选类:

class Table {
    //...
    public bool check(int id) {
        if (this->cells[id]) {
            this->isGood[id] = 0;
            // the line you have, isgood[table->cells[id]-1] = 0 looks buggy:
            // you treat table->cells[id] as a true/false value one line ago;
            // probably not a valid array index? I'm taking a stab at what to do.
        }
    }
}

答案 4 :(得分:1)

通常不要在宏中引用变量。

首先,确保名称有意义。你在检查什么?是否有副作用?

void update_valid_cells(Table& table, int id, BoolArray& validArray)
{
     if(table.cells[id]==NULL) return;
     validArray[id]-1=false;
}

答案 5 :(得分:1)

我认为C99可以将函数限定为 inline ,因此您可以在不使用宏的情况下获得无函数调用的加速。此外,大多数C编译器为此目的支持__inline等扩展。