2017-11-09 20 views
-1

以下では、MY_INT2宣言とMY_INT3宣言の違いは何ですか? 私はいくつかのコードでかなり定着している問題を抱えているので、テストケースにバグを生成するコードを減らすことは難しいでしょう。これら2つの定義の違いは何ですか

#define MY_INT1 5 
#define MY_INT2 31 
#define MY_INT3 (int) pow(2, MY_INT1)-1 

私は

int mul(int a, int b) { 
    return a*b; 
} 

int someFunction(int in) { 
    //nice 
    return floor(in/MY_INT2); 
} 

int someFunction2(int in) { 
    //silly 
    return floor(in/mul(1,MY_INT3)); 
} 

int someFunction3(int in) { 
    //cast does not solve the issue 
    return floor(in/(int)MY_INT3); 
} 
+0

エラーは何ですか?あなたは実際に何が起こっているかは言わなかった... –

+2

マクロの素晴らしい世界へようこそ。余分なカッコがほとんど必須です。 –

+3

また、 'pow'は浮動小数点*関数であることがわかりますか? 2の累乗を整数として使用する場合は、*ビットシフト*(例えば、 '1 << 5'など)を使用します。 –

答えて

1

マクロは、テキスト置換されている非常に不必要な感じ、次を使用することによって解決される私のコードで問題を取得しています。括弧なしin/(int) MY_INT3ので-1が分割後減算さ

in/32 - 1; 

と同じであるという事実に

in/(int) (int) pow(2, 5) - 1; 

あります。

また、mul(1, MY_INT3)作品

in/(MY_INT3); 

もあなたのように「作業が」期待する必要があります実際には、関数に渡された時にパラメータが評価されているため。

キャスティングは魔法の問題を解決するトリックだと思われるようですが、そうではありません。キャストは、値を表現する方法をコンパイラに指示するだけです。

+0

正しい解決策は、かっこをマクロ自体に入れることです。 – Barmar

+0

正しい解決策は、マクロを使用しないことです –

関連する問題