幼稚園時代「何組」でしたか?

引数つきマクロ宣言って、どういった場面で使うのでしょうか?

例えば

#define abc(a) a*a と定義している場合
x=abc(a) のabc(a)がa*aに変わる。

でも、こんなことしたら
abc(a)関数を呼び出せなくなるのでは?

要するに、「引数つきのマクロ定義が
ある理由などを、説明していただければと思います。

A 回答 (4件)

マクロというのはコンパイルの時点で、「あらかじめ定義しておいた文字列に置換される」ということで、関数とは全く意味が違ってきます。



ご質問の、引数つきマクロについてですが、例えばこんなことをしたかったとします。

sprintf(abc->pqr, "%04d", 4);
strcpy(abc->xyz, "abc");
sprintf(def->pqr, "%04d", 5);
strcpy(def->xyz, "def");
sprintf(ghi->pqr, "%04d", 6);
strcpy(ghi->xyz, "ghi");


引数つきマクロでこんな風に書けます。

#define SCPY(XXX, YYY, ZZZ) \
sprintf(XXX->pqr, "%04d", YYY); \
strcpy(XXX->xyz, ZZZ)

SCPY(abc, 4, "abc");
SCPY(def, 5, "def");
SCPY(ghi, 6, "ghi");

3つの操作の異なる部分だけを記述するため、見やすくなったでしょう。見やすいソースというのはバグを少なくするコツでもありますので、上手に使って下さい。
マクロは置換されるだけなので、構造体名だろうが文字列だろうがOKです。
    • good
    • 0

本題に関しては他の方々の回答の通りです。



> でも、こんなことしたら
> abc(a)関数を呼び出せなくなるのでは?

に関してですが、
(abc)(a)とすれば、abc関数を呼び出すことが可能です。
    • good
    • 0

>でも、こんなことしたら


>abc(a)関数を呼び出せなくなるのでは?

もちろんそうです。だから、マクロ名と関数名には、
同じものを使いません。

マクロの使い方は、高速化と、型を選ばないと言うこともありますが、
他にもいろいろな使い方があります。
中には邪悪な使い方もあります。
『Cプログラミング専門課程』という本の一部に
マクロの使い方について載っています。
いい本なので、機会があれば見てください。

参考URL:http://www.amazon.co.jp/exec/obidos/ASIN/4774100 …
    • good
    • 0

関数を呼ぶとそのための時間が少し掛かってしまいます(オーバーヘッド)。

マクロだとその場で展開され、更にコンパイラがそれを最適化して高速化する可能性が高まります(メモリの無駄に終ることもあるかも知れませんが)。inline があればこれは解消しますがC99以前のCにはありません。

あとはマクロは型を無視出来るというのがあります。たとえば

#define min(x,y) ((x)<(y)?(x):(y))

と書いた場合、x, y は int でも double でも使えます。関数では個別に関数名を変えて作るしかありません。(C++ではtemplate使えば一発で書けますし同じ名前で引数の型が違うだけという関数を作れますがCでは出来ません)。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報