我需要一些帮助以更安全的方式重写以下行并将其重写为函数,但是该代码是在函数内部定义的事实使我很难想到一种聪明的方法,因为显然它将涉及声明几个论点。
#define CHECK(id) if(table->cells[id]) isgood[table->cells[id]-1] = 0;
哪里table
是一个struct
,isgood
是一个int
。
我需要一些帮助以更安全的方式重写以下行并将其重写为函数,但是该代码是在函数内部定义的事实使我很难想到一种聪明的方法,因为显然它将涉及声明几个论点。
#define CHECK(id) if(table->cells[id]) isgood[table->cells[id]-1] = 0;
哪里table
是一个struct
,isgood
是一个int
。
直接翻译(如果 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],这会很糟糕。
显然这将涉及声明几个论点
那有什么问题?
为什么不只是一个接收table
并id
执行此操作的函数?
void foo(TableType & t, int id)
{
if (t.cells[id])
isgood[t.cells[id]-1] = 0;
}
ps
这确实是一个糟糕的宏。这个名字非常具有误导性。
pps
整个事情很奇怪,这个函数的逻辑让我无法理解。这究竟应该达到什么目的?
如果您在 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.
}
}
}
我认为 C99 可以将函数限定为内联函数,这样您就可以在不使用宏的情况下加速无函数调用。此外,大多数 C 编译器为此目的支持诸如 __inline 之类的扩展。
通常最好不要在宏中引用变量。
首先,确保名称有意义。你在检查什么?而且有副作用吗?
void update_valid_cells(Table& table, int id, BoolArray& validArray)
{
if(table.cells[id]==NULL) return;
validArray[id]-1=false;
}