2014-07-25 7 views
0

내 코드에서 핫스팟의 일부인 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; 
} 
+0

어떤 부작용이 있습니까? 이 코드는 아무 것도 수정하지 않는 것 같습니다. – murgatroid99

+0

'((uintptr_t) p & FLAG1_BIT)! = 0' 표현은 부작용이 없습니다. –

+0

아마도'return (struct node *) ((uintptr_t) p | FLAG1_BIT); '플래그를 설정 한 함수를 게시 했어야합니다. – arunmoezhi

답변

4

첫째, 컴파일러가 인라인하지 왜 이유를 볼 수 있으므로,이 연습은 아무 것도 달성하지하는 모든 좋은 기회가있다, 명심하십시오.

부작용을 피하는 첫 번째 규칙은 매개 변수가 정의에 한 번만 표시되는지 확인하는 것입니다. 그런 다음 정의에서 매개 변수와 전체 정의를 괄호로 묶습니다.

#define isFlag1Set(p) (((uintptr_t) (p) & FLAG1_BIT) != 0) 
-4

시도 :

#define IS_FLAG_1_SET(p)    \ 
{          \ 
    (((uintptr_t) p & FLAG1_BIT) != 0) \ 
} 
+4

다음과 같은 경우에는 작동하지 않습니다. 중반에 사용 표현의 색소. – Jashaszun

+0

괄호는 완전히 잘못되었습니다. 'if (IS_FLAG_1_SET (p)) '문에서 사용할 수있는 것이 필요합니다. –

관련 문제