Преобразовать встроенную функцию в макрос
У меня 1 строка inline
функция, которая является частью горячей точки в моем коде. Я хотел бы видеть, было ли бы изменение этого макроса полезным. При написании текста мне не приходилось беспокоиться о побочных эффектах. Но как мне написать макрос для этого без побочных эффектов?
#define FLAG1_BIT 4
struct node
{
unsigned long key;
struct node* child[K]; //format <address,flag1,flag2,flag3>
};
static inline bool isFlag1Set(struct node* p)
{
return ((uintptr_t) p & FLAG1_BIT) != 0;
}
2 ответа
Решение
Во-первых, имейте в виду, я не вижу причин, почему компилятор не включил бы его, поэтому есть все шансы, что это упражнение ничего не даст вообще.
Первое правило, позволяющее избежать побочных эффектов, заключается в том, чтобы параметр появлялся в определении только один раз. Далее в определении оберните параметр и все определение в скобках:
#define isFlag1Set(p) (((uintptr_t) (p) & FLAG1_BIT) != 0)
Пытаться:
#define IS_FLAG_1_SET(p) \
{ \
(((uintptr_t) p & FLAG1_BIT) != 0) \
}