質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1398閲覧

関数、マクロの使いわけを考える

reotantan

総合スコア295

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/08/31 04:13

関係ないんですが、下のようにマクロの中身を説明する部分が複数の文になった場合には{}で表わすんですよね?
本題に入りますが、どのようなものをマクロ、関数で表わすべきか
皆様の使い分けに対する考えを教えてください

swap(type, a, b); {type temp; temp = a; a = b; b = temp;};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Cのマクロは、プリプロセッサとも呼んでいるように、関数の代わりとして使うよりは、コンパイル時に使う方が本来の使い方だと思います。
上の人も書いている様に、コンパイル時に値を確定できるため、OSの違いを吸収したりできます。

#ifdef WIN32
/* Windows特有の処理
#else
/* Linuxなどの処理
#endif

これでVisualStudioなどでは、コンパイル時にWIN32が定義されて、「Linuxなどの処理」の部分は無視されます。
値を入れることもできるので、あたかも定数の様にも使用できます。

また、本来はマクロを複数行で定義するときは、バックスラッシュを使います。
質問者様のいう中括弧は、マクロ利用時に予期しないBUGを防ぐために使用します。
以下のサイトに詳しく書かれているので、参照してみてください。

JPCERT

上のサイトにもある様に、マクロは思わぬBUGを引き起こすことにつながるので、利用はできるだけプリプロセッサ値の定義か、長い名前のための別名程度に抑えておいた方が良い戸といます。

投稿2015/08/31 05:42

shanxia

総合スコア1038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/31 06:21

とても分かりやすい解説ありがとうございます。 プリプロセッサの知識を得ないと、実用的にマクロを利用できないですね;; ありがとうございました
guest

0

マクロはすべてを文字列展開してしまうので、特有のトラブルも多いものです。関数として実装できるものであれば、関数とした方がいいでしょう(C++であれば、テンプレートと参照を使うことで、上のswapも関数として実装できます)。

逆に、マクロでしかできないことには、以下のようなものがあります。

  • コンパイル時点で値を確定させる(相応の書き方が必要ですが)
  • 「型」そのものを操作の対象とする(あくまで文字列操作ではあるのですが)
  • 言語拡張のようなことにも使える(C言語向けのオブジェクト指向ライブラリのGObjectや、同じくC言語向けの例外処理ライブラリなど、通常のC言語でできないことを、マクロを記法に取り入れて再現するライブラリもあります)

投稿2015/08/31 05:00

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/31 06:18

なるほど、乱用は危険で、使い方も初心者には難しそうです。 ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問