«недопустимое использование пустого выражения» - PullRequest
4 голосов
/ 15 марта 2012

Мне нужно написать макрос, который работает на bitarray и выглядит следующим образом:

   array[0] = number of bits in bitarray (integer) 
   array[1..n] = bits

Макрос должен выглядеть следующим образом:

GetBit(pointer, index)
Macro *must* return 0,1 or call function similar to exit().

Это моя (рабочая) версия со встроенными функциямимакроса, который я должен написать:

static inline unsigned long GetBit(BitArray_t array, unsigned long index)
{
        if ((index) >= array[0])
                        exit(EXIT_FAILURE);
        else
                return (GetBit_wo_boundary_checks(array,index));
}

Вот что у меня есть:

#define GetBit(array,index)\
                (((index) < array[0] || exit(EXIT_FAILURE)) ?\
                        GetBit_wo_boundary_checks(array,index) : 0)

Моя проблема в том, что этот должен сделатьпроверка границы индекса (i

Я подумал, что можно обойти эту проблему, поместив выход в оцененное короткое замыканиеусловие, но я получаю: «недопустимое использование выражения void» .

Есть ли способ сделать этот макрос прозрачно выходным (), когда индекс превышает максимум, определенный в массиве [0]

Ответы [ 4 ]

6 голосов
/ 15 марта 2012

Одним из вариантов будет использование оператора запятой с вашим вызовом exit(), например:

(exit(EXIT_FAILURE), 0)

Это небольшой взлом, но это заставит выражение вернуть значение 0должен удовлетворять компилятор.

4 голосов
/ 15 марта 2012

Для этого можно использовать оператор ,:

#define GetBit(array,index) \
            (((index) >= array[0]) \
             ? exit(EXIT_FAILURE), -1 \
             : GetBit_wo_boundary_checks(array,(index)))

Обратите внимание, что index оценивается дважды, что небезопасно.

2 голосов
/ 15 марта 2012

Вы пытались заменить exit(EXIT_FAILURE) на (exit(EXIT_FAILURE), 1)?Хотя это только предположение, это должно сработать.Выражение теперь создает значение (в данном случае правый операнд оператора запятой - 1), но сначала вынуждает вычислять вызов на exit, что является частью, которая вас действительно волнует.

1 голос
/ 15 марта 2012

возможно, вы могли бы объявить функцию "аналогично выходу", которая вызывает exit и возвращает значение.

...