プロが教えるわが家の防犯対策術!

マクロ関数 #define の効果は何ですか?
わかりやすく教えて下さい

A 回答 (5件)

言語におけるマクロ関数#defineは、ソースコード内で指定した文字列を別の文字列に置換するためのプリプロセッサ命令です。



具体的には、プログラムの実行前にコンパイラがソースコードを解釈する際に、#defineで指定された文字列が出現した場合に、その文字列を指定した別の文字列に置き換えます。これによって、コードの可読性を向上させたり、同じ処理を繰り返し記述する手間を省くことができます。

例えば、以下のようなコードがあったとします。


#include <stdio.h>

int main() {
int a = 10;
printf("%d\n", a);
return 0;
}

ここで、aという変数を出力する部分を何度も書くのは面倒なので、マクロ関数#defineを使って簡潔に書いてみましょう。


#include <stdio.h>

#define PRINT_A(x) printf("%d\n", x)

int main() {
int a = 10;
PRINT_A(a);
return 0;
}

こうすることで、PRINT_A(a)という一行で、printf("%d\n", a)と同じ処理を行うことができます。

なお、マクロ関数#defineは、プリプロセッサで行われる置換のため、文字列の置換を行うために使う場合は、文字列内に引用符があると正しく置換されない場合があるため、注意が必要です。
    • good
    • 0
この回答へのお礼

ありがとうございます!わかりやすいです

お礼日時:2023/04/06 08:44

>マクロ関数 #define の効果は何ですか?



ちょっとリッチな文字列置換です。
マクロ関数の()内に指定された、「,」で区切られた引数が、定義値の中に含まれるそれぞれの引数に対応して置き換えられます。

たとえば、次のようなコード

#define ADD_SUB(x, y) printf("x + y = %d\n", x, y); printf("x - y = %d\n", x, y);

ADD_SUB(1, 2)
ADD_SUB(5, 10)

は、プリプロセッサを通すと

printf("x + y = %d\n", 1, 2); printf("x - y = %d\n", 1, 2);
printf("x + y = %d\n", 5, 10); printf("x - y = %d\n", 5, 10);

というコードに変換されます。コンパイル時にはこのコードを書いたものとみなしてコンパイルされます。「~と同じ処理をしてくれる」ではなく、「~と書いたことにしてくれる」というところがミソです。


また、引数に「...」をくっつけると、printf()のような可変引数と同じようなことができます。

#define MYPRINTF(x, y...) printf(x, y)

MYPRINTF("x + y = %d\n", 1, 2);
MYPRINTF("x + y = %d\n", 5, 10);

は、

printf("x + y = %d\n", 1, 2);
printf("x + y = %d\n", 5, 10);

になります。
    • good
    • 0

「マクロ関数 #define」ってなんだろうか. 「マクロ関数」などという用語は存在しないし, 仮に存在するとしても #define は「関数」ではない.



ところで #define によるマクロの効果は理解してる?
    • good
    • 2

#define は他の方が書かれているように関数のように書くこともできるのですが、コンパイル前に処理される文字の置き換えに過ぎません



そのため通常の関数と異なり、関数呼び出しのオーバー・ヘッドが起きません
オーバー・ヘッドは割とコストのかかる処理なので、これが起きなければプログラムが速くなります

ただし C99 以降は、C++ 同様にインライン関数が使えるので、C99 以降が使える環境・状況なら通常の関数よりも可読性が低くなりがちな関数形式のマクロを使う必要はなくなりつつあります
    • good
    • 0

標準ヘッダ <tgmath.h> の sin のような「ジェネリック関数」を作ろうとすると, 今日の C では _Generic をマクロにくるむしかないような気がする>#4. あるいは, 引数をいろいろ加工できるので「列挙子から文字列を返す」関数を書くときに使ったりもできなくはない.



なお #2 の可変引数の書き方は非標準であり, 標準では
#define HOGE(fmt, ...) printf(fmt __VA_OPT__(, __VA_ARGS__))
のように書く.
    • good
    • 0

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