• ベストアンサー

関数形式マクロ

type型の二つの値を交換する関数形式マクロ swap(type,a,b)を定義せよ 例えばint型でx、yに5、10があたえられているとき、swap(int,x,y)を 呼び出した後は、x,yには10と5が格納されていなければならない。 ・・という問題で以下のようにswapを作ったのですがエラーがでます どこが問題か教えていただけないでしょうか? #include <stdio.h> #define swap(type,a,b) (m = a a = b b = m) int main(void) { int x = 1,y = 2,m; swap(int,x,y); printf("x=%d y=%d\n",x,y); return(0); }

質問者が選んだベストアンサー

  • ベストアンサー
  • goosyu
  • ベストアンサー率58% (36/62)
回答No.5

#3 salsberryさんとまるかぶりしました。失礼しました。 参考になるサイトがありましたので貼っておきます。 http://www.nurs.or.jp/~sug/soft/super/macro.htm

参考URL:
http://www.nurs.or.jp/~sug/soft/super/macro.htm
Nya-22
質問者

お礼

サイトありがとうございます。また機会があればよろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • goosyu
  • ベストアンサー率58% (36/62)
回答No.4

#1です。 コンパイルエラーの原因はわかっていただけたでしょうか? 参考までに,私が考えたマクロを貼っておきます。 このマクロのメリットは外部にint宣言しなくても使えることです。 #define swap(type,a,b) {type m; m = a; a = b; b = m;}

すると、全ての回答が全文表示されます。
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

すぐに考えつくのは #define swap(type,a,b) { type m; m = a; a = b; b = m; } ですが、これだと if (x < 0) swap(int,x,y); else { ... } のような使い方をした場合に問題が出るので、もう一工夫が必要です。

Nya-22
質問者

お礼

一工夫がんばります。回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • goosyu
  • ベストアンサー率58% (36/62)
回答No.2

 回答者#1です。少し情報を追加します。  プリプロセッサによって#defineマクロは展開されています。コンパイラがどのように処理しているか確認出来ますのでその方法を紹介します。  お使いのコンパイル環境のコンパイルオプション(またはスイッチ)でプリプロセッサのオプション(またはスイッチ)を探して有効にして下さい。これでどのように#defineが置き換えられているか確認出来ます。  例として「gcc」と「VC++」の設定方法について書いておきます。 【例1】「gcc」の場合  「-E」で標準出力されますので「src.c」をコンパイルする場合「gcc -E src.c > src.i」とすると「src.i」にファイルが作成されます。 【例2】「VC++」の場合  「/P」を追加してコンパイル。VisualStudio2008の統合環境からは「プロジェクト」の「プロパティページ」から「構成」の「構成プロパティ」,「C/C++」,「プリプロセッサ」を順に開き,「前処理済みファイルの生成」を「いいえ」から「行番号付き (/P)」に変更してコンパイル(ビルド)します。ソースファイルと同じ場所にソースファイルの拡張子が「.i」のファイルが生成されます。

Nya-22
質問者

お礼

返答おくれてすみません。親切な回答ありがとうございます! 何とかわかりそうなので、補足のほうも試してみたいと思います。

すると、全ての回答が全文表示されます。
  • goosyu
  • ベストアンサー率58% (36/62)
回答No.1

こんにちは早速ですが問題点について説明します。 「#define swap(type,a,b) (m = a a = b b = m)」の場合,「swap(int,x,y);」 は次のように置き換えられる事が予想されます。(この場合は単純に「a」に「x」,「b」に「y」にそれぞれ置き換えるだけです。) (m = x m = y y = m); これではコンパイルエラーが出るはずです。「m = x; m = y; y = m;」などになるような#define定義が必要です。 尚,この問題の回答としては「type」も使うようなコーディングを求められていると思います。

すると、全ての回答が全文表示されます。

関連するQ&A