3

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

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

哪里table是一个structisgood是一个int

4

6 回答 6

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],这会很糟糕。

于 2009-03-27T20:51:24.297 回答
4

显然这将涉及声明几个论点

那有什么问题?

于 2009-03-27T20:52:38.053 回答
2

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

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

ps

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

pps

整个事情很奇怪,这个函数的逻辑让我无法理解。这究竟应该达到什么目的?

于 2009-03-27T20:50:04.580 回答
2

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

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.
        }
    }
}
于 2009-03-27T20:55:57.857 回答
1

我认为 C99 可以将函数限定为内联函数,这样您就可以在不使用宏的情况下加速无函数调用。此外,大多数 C 编译器为此目的支持诸如 __inline 之类的扩展。

于 2009-03-28T07:40:15.390 回答
1

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

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

void update_valid_cells(Table& table, int id, BoolArray& validArray)
{
     if(table.cells[id]==NULL) return;
     validArray[id]-1=false;
}
于 2009-03-27T20:52:04.623 回答