C言語 Yaccのプログラムについて、添付画像のようなマクロ関数を書き




C言語 Yaccのプログラムについて、添付画像のようなマクロ関数を書きましたが、
エラー: expected expression before ‘)’ token
と出てしまい、switch文の部分に問題があると言われました。こ のプログラムでは、整数型同士の演算は整数型で出力し、それ以外は実数型で出力する、というもので、ARITHに渡す引数は、順に演算結果、値1、演算子、値2となっています。
自分の中では、OP(演算子)が’+’と同じかどうかをswitch文で比較できるのか、疑問に思っているところです。
恐れ入りますが、このプログラムの欠陥を教えていただけませんでしょうか。
よろしうお願いいたします。






switch((#OP)[0]){
とすればいけるかと思います。
呼び出し側は、こんなのをイメージしています。
ARITH(e, x, +, y);
ARITH(e, x, *, y);
ただし、case ‘*’またはdefaultがないと、コンパイラエラーになってしまうと思いますが。
また、
E.V_fld.I = X.V_fld.I OP Y.V_fld.I; \
は、
(E).V_fld.I = (X).V_fld.I OP (Y).V_fld.I; \
のように、E、X、Yはカッコでくくっておいたほうが良いです。
ところで、マクロ展開の結果switchには定数が入ることになるため、呼び出されるcaseは常に1箇所です。決して呼び出されない部分が贅肉のように展開されてしまいます。最適化処理で実質不要な条件判定のところは最適化はされるでしょうけども。。。
◆早速のご回答、どうも有難うございます!
少しだけ疑問が湧いたのですが、
#はマクロの中では””に置き換わる、といった旨を別のサイトで知りましたが、実際に”OP”とするとエラーが出てしまいました。
また、[0]についてもその働きが分からないので、教えていただけるとありがたいです。
拙い質問ですが、重ねてよろしくお願いいたします。