ここから本文です

C言語でマクロを多用するメリットは何でしょうか?

アバター

ID非公開さん

2019/10/1515:36:20

C言語でマクロを多用するメリットは何でしょうか?

例えば・・・

#define ERROR(n) ((n) < (0))

int Init()
{
//初期化処理
//失敗すると負の数、成功すると0を返す
}

int main()
{
//初期化に失敗したら-1で終了
if(ERROR(Init())) return -1;

return 0;
}

のような感じです。
これならマクロを使わず、

if(Init() < 0) return -1;

でも同じはずです。

教えて下さい。

閲覧数:
46
回答数:
5

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2019/10/1717:25:05

leh********さんのお答えにナイスを入れました。
大事なことなので、私からも申し上げておきたいと思います。


「メリット」はありません。基本的なこととしてマクロの使用は避けるべきです。と、このくらいキッパリ言っておいた方が良いのではないかなと。


【例示のようなマクロはセンスの悪さをさらけ出しているだけ】

私もそう思います。初心者の方は真似をなさらないように。(まず、マクロを使用しないことをお考えになった方が良いです。)

メリットは無いのです。害悪だけがあります。どういう害悪があるのかについては応用を深めると分かってきます。初心者の段階ではそこに気付かないわけ。プログラムの規模がどんどん上がっていって、そしてどこかの時点で気付く形となります。マクロは良くないと。

とはいえ、非常に僅かな事例でマクロというものが素晴らしいと思えることもあります。そのようなマクロが作れるようになるために、初心者の方々が不適切であってもマクロをどんどん作り続けるということには賛成です。ただし、仕事でやらない方が良いです。個人的な趣味の範囲で沢山マクロを作ると良いです。そのうちコツが分かって来る筈です。(たぶん、数年以内です。)

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

leh********さん

2019/10/1618:19:29

> C言語でマクロを多用するメリットは何でしょうか?
強いて言えば、関数呼び出しのオーバーヘッドがなくなることぐらいですね。
例示のようなマクロはセンスの悪さをさらけ出しているだけです。
マクロは副作用を注意しなければならず使用は避けるべきです。
#標準ライブラリにもいくつかはマクロ実装が許可されている上に
#レベルの低い入門書はこれを良く使っている

//初期化処理
//失敗すると負の数、成功すると0を返す



// 初期化処理
// 失敗すると 0 、成功すると 0 以外を返す

とすれば

if (!Init()) return -1;
// 初期化できなければ -1 を返す

と可読性が上がりますよ。

2019/10/1611:45:24

定数マクロは良く使うけど関数マクロはあまり使いませんね。

関数マクロは読みにくいです。頭の中で変換しなければならないので。

引数の副作用の問題があります。

同じような関数が沢山続くときは関数マクロにすると短く書けるという利点があります。
---
関数マクロより関数にした方がいいと思います。
引数の型チェックもしてくれます。

「関数を呼ぶよりはオーバーヘッドが少ない」という考えもありますが、
今のコンパイラは最適化が進んでいるので関数をインライン展開してくれます。

というわけでメリットはあまりないと思います。

プロフィール画像

カテゴリマスター

nan********さん

2019/10/1516:47:23

一応、マクロ定義したものは使用する場所で直接コードに置き換わるので、関数を呼ぶよりはオーバーヘッドが少ない、というメリットがあります。
ただ、同じコードを何億回とか呼ばない限り、今時のCPUで速度が変わることはほぼないので、少なくとも関数マクロは不要と言えば不要と思います。

また引数に++とか--を使ったものを渡すと思わぬ副作用を呼ぶので、その意味でも関数マクロは使わない方が良いと思います。

プロフィール画像

カテゴリマスター

2019/10/1516:03:14

if(Init1() < 0) return -1;
if(Init2() < 0) return -1;
if(Init3() < 0) return -1;





if(Init1() <=0) return -1;
if(Init2() <= 0) return -1;
if(Init3() <= 0) return -1;


に変更された場合便利。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる