C言語関係掲示板

過去ログ

No.928 マクロで置換 「a(x,1,z)」→「b(x,y)」 「a(x,0,z)」→「c(x,z)」

[戻る] [ホームページ]
No.11800

マクロ化について
投稿者---カンペの秋葉です。(水曜PM11時)(2004/01/15 15:45:36)


ヘッダーファイルに以下のマクロを
#define a(x,1,z) b(x,y)
#define a(x,0,z) c(x,z)
と定義すると、コンパイルエラーとなってしまいます。
本来ソースを修正すれば簡単なのですが、修正量が
膨大なためこのような引数の値を変えてマクロを使用する等で
回避したいのですが、いい方法あればおしえてください。

No.11801

Re:マクロ化について
投稿者---nop(2004/01/15 15:56:59)


>#define a(x,1,z) b(x,y)
>#define a(x,0,z) c(x,z)
>と定義すると、コンパイルエラーとなってしまいます。

マクロの定義の仕方が間違っています。
上記の定義は引数付きのマクロの定義と見なされます。

上記から

 「a(x,1,z)」→「b(x,y)」
 「a(x,0,z)」→「c(x,z)」

と言う変換を行いたい様なので、エディタの置換機能で置換するか、
Perl などで置換プログラムを組んで置換することをお薦めします。

No.11802

Re:マクロ化について
投稿者---たか(2004/01/15 15:59:28)


>ヘッダーファイルに以下のマクロを
>#define a(x,1,z) b(x,y)
>#define a(x,0,z) c(x,z)
>と定義すると、コンパイルエラーとなってしまいます。
>本来ソースを修正すれば簡単なのですが、修正量が
>膨大なためこのような引数の値を変えてマクロを使用する等で
>回避したいのですが、いい方法あればおしえてください。

引数付きのマクロに0や1などの定数を指定することはできません。
むしろエディタの置換機能で変換した方がいいように思います。

No.11814

Re:マクロ化について
投稿者---カンペの秋葉です。(水曜PM11時)(2004/01/15 18:01:40)



>引数付きのマクロに0や1などの定数を指定することはできません。
>むしろエディタの置換機能で変換した方がいいように思います。
たかさん、NOPさんお返事ありがとうございます。
エディタの置換でやれば、確かに簡単なのですが、実は他の機種でソースを
共通化している手前、片方だけ置換すると既存のものの修正・確認作業が
発生してしまいます。
そのため、マクロ化等でなんとか置き換えたいのですが、、、、


No.11816

Re:マクロ化について
投稿者---かずま(2004/01/15 18:26:41)


> そのため、マクロ化等でなんとか置き換えたいのですが、、、、
#define a(x, p, z)  (p ? b(x, y) : c(x, z))
ただし、関数 a() の宣言や定義の前には置かないように。
あくまでも、関数呼び出しの置き換えです。

No.11841

Re:マクロ化について
投稿者---カンペの秋葉です。(水曜PM11時)(2004/01/16 13:34:13)


>#define a(x, p, z) (p ? b(x, y) : c(x, z))
</pre>ただし、関数 a() の宣言や定義の前には置かないように。
>あくまでも、関数呼び出しの置き換えです。
ありがとうございました。
その置換は無事できました。

その置換を見直していたところ、もう一点やらないといけなさそうな置換がありました。
#define a(x,1,z) b(x,y)
#define a(x,2,x) c(x,y)
#define a(x,3,y) d(x,y)
(プリプロセッサなので定数を使わないようにしないといけない)
これを実現できる置換はありますか?

No.11848

Re:マクロ化について
投稿者---てつや(2004/01/16 14:53:37)


>その置換を見直していたところ、もう一点やらないといけなさそうな置換がありました。
>#define a(x,1,z) b(x,y)
>#define a(x,2,x) c(x,y)
>#define a(x,3,y) d(x,y)
「#define a(x, p, z) (p ? b(x, y) : c(x, z))」を理解すれば自ずと答えはでると思います。

No.11857

Re:マクロ化について
投稿者---カンペの秋葉です。(水曜PM11時)(2004/01/16 16:21:02)


>「#define a(x, p, z) (p ? b(x, y) : c(x, z))」を理解すれば自ずと答えはでると思います。
そうですね。少し考えればできそうなので、アドバイスありがとうございます。


No.11859

Re:マクロ化について
投稿者---たか(2004/01/16 16:52:05)


#define a(x, p, z) ((!p) ? c(x, z) : (p == 1) ? b(x, y) : (p == 2) ? c(x, y) : d(x, y))

最適化してくれるコンパイラがあるといいのですが・・・・

No.11860

Re:マクロ化について
投稿者---たか(2004/01/16 16:56:05)


>最適化してくれるコンパイラがあるといいのですが・・・・

BCC5.6.4だと思い切り最適化してくれました。条件ジャンプの陰も形
も残りません。多分VC++やgcc等他のコンパイラでも同じでしょう。
(最適化レベルにもよると思いますが)

No.11876

Re:マクロ化について
投稿者---カンペの秋葉さん(2004/01/16 22:12:15)


>BCC5.6.4だと思い切り最適化してくれました。条件ジャンプの陰も形
>も残りません。多分VC++やgcc等他のコンパイラでも同じでしょう。
>(最適化レベルにもよると思いますが)
ちょっとやってみます。ありごとうございます。