いつもお世話になってます。
現在、C言語のためのエラー処理を描こうとしているのですがマクロで悩んでいます。
まず、2つのec_nullとec_cmpという以下のマクロがあります。ec_nullのprinte関数はエラーが起きたファイルや行数など諸々の情報を出力するだけです。
lang
1/* x と val を比較して一緒だったらエラー */ 2#define ec_cmp(x, val) \ 3{\ 4 if ((intptr_t)(x) == (intptr_t)(val)) \ 5 return true;\ 6} 7 8/* x と NULL を比較する */ 9#define ec_null(x) \ 10{\ 11 if (ec_cmp((x), NULL))\ 12 printe("File <%s> Function <%s> Line <%d> returned NULL", __FUNCTION__, __FILE__, __LINE__);\ 13} 14 15
そして、ec_nullは、例えばmallocの時のチェックに使いたいと思っています。
mem = malloc(100) ec_null(mem)
ですが、これをコンパイルしようとすると以下のようなエラーが出ます。
test.c:28:3: error: expected expression ec_null(NULL); # わざとNULLを入れてテスト ^ ./ec.h:6:7: note: expanded from macro 'ec_null' if (ec_cmp((x), NULL))\ ^ ./ec.h:11:24: note: expanded from macro 'ec_cmp' #define ec_cmp(x, val) \
マクロをよく理解していないことが原因だと思い自分でも色々と調べてみたのですが、未だに理由がわかりません。
何がいけないのでしょうか? また、エラー処理としてもっとうまい方法があれば、よろしくお願いします。
********************** 追記 *************************
色々と試していたのですが、x と val の比較 if ((intptr_t)(x) == (intptr_t)(val))を以下のように直接ec_nullに入れると動きました
lang
1#define ec_null(x)\ 2 {\ 3 if ((intptr_t)(x) == (intptr_t)(NULL)) \ 4 printe("File <%s> Function <%s> Line %d returned NULL\n", __FUNCTION__, __FILE__, __LINE__);\ 5 } 6
ということはec_cmpをif文の中に入れていたのがいけなかったということでしょうか? それかec_cmpからreturnするということについて何かおかしかったのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/07/02 16:23