Нужна помощь в переписывании макроса C как функции - PullRequest
3 голосов
/ 27 марта 2009

Мне нужна помощь в переписывании следующей строки более безопасным способом и переписывании ее как функции, однако тот факт, что этот код определен внутри функции, затрудняет мне думать о разумном способе выполнения потому что, по-видимому, это потребует объявления нескольких аргументов.

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

, где table - это struct, а isgood - это int.

Ответы [ 6 ]

5 голосов
/ 27 марта 2009

Прямой перевод (если таблица-> ячейка [id] имеет тип int):

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

Позвонить по номеру:

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

Однако я бы немного переименовал / переделал это. Я бы особенно изменил имя. Также нет проверки ошибок - то есть, если table-> cell [id] == 0, вы попытаетесь установить isgood [-1], что было бы плохо.

4 голосов
/ 27 марта 2009

по-видимому, это будет связано с объявлением несколько аргументов

Что с этим не так?

2 голосов
/ 27 марта 2009

Если вы работаете в 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.
        }
    }
}
2 голосов
/ 27 марта 2009

Почему бы не просто функция, которая получает table и id и делает это?

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

приписка

Это действительно плохой макрос. Название вводит в заблуждение.

p.p.s.

Все это довольно странно, и логика этой функции ускользает от меня. Чего именно это должно достичь?

1 голос
/ 28 марта 2009

Я думаю, что C99 может квалифицировать функции как inline , поэтому вы получите ускорение вызова без функции без использования макросов. Кроме того, для этой цели большинство компиляторов C поддерживают такие расширения, как __inline.

1 голос
/ 27 марта 2009

Как правило, лучше не ссылаться на переменные в макросе.

Сначала убедитесь, что название имеет смысл. что вы проверяете? И есть ли побочный эффект?

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