2016-11-24 11 views
-2

Это одна из самых странных вещей, с которыми я столкнулся. Моя проблема заключается в следующем:Побитовая операция с постоянной проблемой

Прежде всего, я использую Visual Studio 2015 на Windows 7. В проекте C++ \ CLI, у меня есть код, подобный Тхо следующее:

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

Где CONST определен в другой (не CLR) DLL будет 0x111. Выглядит довольно прямолинейно. Проблема, которую я испытывал, заключается в том, что когда я ввел процедуру, в которой flag равен 0x40. Мне кажется, что эта процедура должна печатать Failed., когда на самом деле она печатается Passed.. Следующее, что я сделал, было, чтобы изменить свой код на следующее:

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

Теперь, прерывающие выполнение на printf, я получил следующие значения в Дозоре:

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

Я не мог смотреть значение CONST, хотя VS не знал этого в этом контексте.

Насколько я могу судить, я мог бы обойти это, используя local, но я бы лучше понял его. Может кто-нибудь, пожалуйста, скажите мне, что случилось с компиляцией/исполнением? Спасибо!

EDIT: В прилагаемом файле заголовка (входит в extern "C"), она определяется как так:

#define CONST/
    C1 | C2 | C3 

Где довольно регулярно, C1 является 0x1, C2 является 0x10 и C3 является 0x100.

+1

Как определяется 'CONST'? –

+0

Вы пытались определить 'CONST' как' extern'? –

+0

Возможно, это не так понятно. В частности, претензия, «определенная в другой DLL не CLR» представляется весьма маловероятной, экспорт данных из dll не очень очевиден. –

ответ

0

flag & CONST распространяется до flag & C1 | C2 | C3, что эквивалентно (flag & C1) | C2 | C3.

Не всегда #define выражения без круглых скобок, или приоритет оператора укусит вас.

Если вы не имеете контроля над головой, или обернуть его в свой собственный макрос:

#define GOOD_CONST (CONST) 

Или поместить его в переменную (используйте extern, если это необходимо, чтобы выставляться в заголовке):

unsigned int GOOD_CONST = CONST; 

И используйте только это в своем коде.

+0

или: constexpr unsigned GOOD_CONST = CONST; – tukra