2016-11-24 5 views
-2

これは私が遭遇した最も奇妙なことの一つです。私の問題はこれです:定数問題を伴うビット演算

CONSTが定義されている
void Class::function(int flag) 
{ 
    if ((flag & CONST) != 0) 
     printf("Passed."); 
    else 
     printf("Failed."); 
} 

:すべての

まず、私はC++ \ CLIプロジェクトでのWindows 7上のVisual Studio 2015を使用しています、私は、次のカントーなコードを持っています別の(非CLR)DLLで0x111になります。かなりまっすぐに見えます。私が持っていた問題は、flag0x40に等しい手順に入ったときです。私には、実際にはPassed.を印刷したときに、この手順でFailed.を印刷するように見えます。私は次のことは、次のように私のコードを変更しました:

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 

私が見ることができませんでしたその文脈ではVSはそれを知らなかったが、CONSTの値。

私の言う限り、私はこれをlocalを使って回避することができましたが、私はむしろそれを理解したいと思います。誰かがコンパイル/実行に何が問題なのか教えていただけますか? ありがとう!

EDIT:extern "C"として含まれる)を含むヘッダ・ファイルでは、そうのように定義される:

#define CONST/
    C1 | C2 | C3 

はかなり定期的に、C10x1ある、C20x10ある場合、及びC30x100あります。

+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 unsigned GOOD_CONST = CONST; – tukra