2016-11-24 6 views
-2

이것은 내가 만난 가장 이상한 것 중 하나입니다. 내 문제는 이것이다 : CONST이 정의지속적인 문제가있는 비트 단위 연산

void Class::function(int flag) 
{ 
    if ((flag & CONST) != 0) 
     printf("Passed."); 
    else 
     printf("Failed."); 
} 

을 : 나는 C++ \ CLI 프로젝트에서 윈도우 7에서 Visual Studio 2015를 사용하고, 모든

첫째, 나는 다음과 같은 상점과 비슷한 코드를 다른 (비 CLR) DLL 0x111 수 있습니다. 꽤 똑바로 보인다. 내가 가진 문제는 flag0x40과 같은 절차를 입력했을 때입니다. 실제로이 프로 시저가 Failed.을 인쇄해야하는 것처럼 보입니다. 실제로는 Passed.이 인쇄되었습니다. 내가했던 다음 일은 다음에 내 코드 변경했다 :

res = 0x110 
local = 0x111 
localRes = 0x0 

내가 볼 수 없습니다 : 지금

void Class::function(int flag) 
{ 
    int local = CONST, localRes = flag & local, res; 
    if ((res = (flag & CONST)) != 0) 
     printf("Passed."); 
    else 
     printf("Failed."); 
} 

printf에 실행을 깨고을, 나는 시계에 다음과 같은 값을 가지고 그 문맥에서 VS가 그것을 알지 못했지만 CONST의 값.

내가 아는 한, local을 사용하여이 문제를 해결할 수 있지만 오히려 이해하고 싶습니다. 컴파일/실행에있어 잘못된 점을 알려주시겠습니까? 감사합니다.

편집 :

꽤 정기적으로 C10x1입니다
#define CONST/
    C1 | C2 | C3 

, C20x10이며, C30x100입니다 : (extern "C" 포함) 포함 된 헤더 파일에서, 너무로 정의된다.

+1

어떻게'CONST'가 정의 되었습니까? –

+0

'CONST'을'extern'으로 정의 해 보았습니까? –

+0

어쩌면 이것은 분명하지 않을 수 있습니다. 특히 "다른 CLR이 아닌 dll에서 정의 된"클레임은 매우 드물게 보이지만 dll에서 데이터를 내보내는 것은 분명하지 않습니다. –

답변

0

flag & CONSTflag & C1 | C2 | C3으로 확장되며 (flag & C1) | C2 | C3과 같습니다.

#define 괄호가없는 표현 또는 연산자 우선 순위는 당신을 물게합니다.

머리글을 제어 할 수 있습니다, 중 자신의 매크로를 포장하지 않는 경우 :

#define GOOD_CONST (CONST) 

또는 변수 (헤더에 노출 될 필요가있는 경우 사용 extern)에 넣어 :

unsigned int GOOD_CONST = CONST; 

그리고 코드에만 사용하십시오.

+0

또는 constexpr 부호 없음 GOOD_CONST = CONST; – tukra