C言語のマクロについてです。C言語のマクロには落とし穴が多いので、マクロをマスターして引っかからないようにしましょう。そしてC言語の達人になってください。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
C言語マクロの大きな注意点に
副作用の問題があります。
#define MAX(a,b) ((a) > (b) ? (a) : (b))
上記のマクロを次のように使用したとします。
m = MAX(++a, --b);
コーディングした人の意図は、
aをインクリメントした値と
bをデクリメントした値の大きい方を
mに代入する、だと思われます。
しかし、マクロの展開結果は次のようになります。
m = ((++a) > (--b) ? (++a) : (--b))
大小の比較時に引数のインクリメント、
デクリメントが行われ、さらに、
結果を返す時にインクリメントまたは
デクリメントが行われてしまいます。
これは、明らかにコーディングした人の
意図と異なります。
C言語の関数形式マクロの引数には、
インクリメント、デクリメント等の
演算子を含んだ式を渡さない方がよいでしょう。
PR
ブログ内検索
最新記事
(03/31)
(03/31)
(03/30)
(03/30)
(03/30)
最古記事
(03/23)
(03/24)
(03/25)
(03/26)
(03/27)