C言語の関数形式マクロの定義・呼び出し時の空白の挿入

このQ&Aのポイント
  • C言語で関数形式マクロを定義するときに、どこに空白(スペース)を入れてもよいのか、教えてください。
  • 関数形式マクロとは、引数付きマクロと言っている本もあるようで、例えば、#define mymul(x,y) ((x)*(y))こんなものです。
  • 呼び出す場合も、c=mymul(a,b)と呼び出す場合に、これらのどこに空白を入れてよいのか、よろしくお願いいたします。
回答を見る
  • ベストアンサー

C言語の関数形式マクロの定義・呼び出し時の空白の挿入

C言語で関数形式マクロを定義するときに、どこに空白(スペース)を入れてもよいのか、教えてください。 関数形式マクロとは、引数付きマクロと言っている本もあるようで、例えば、 #define mymul(x,y) ((x)*(y)) こんなものです。 mymul(a,b)と書いてあったら、((a)*(b))に置き換えますという意図です。 ・#の前 ・#とdefineの間 ・mymulと(x,y)の間 ・(とxの間 ・xと,(カンマ)の間 ・,(カンマ)とyの間 ・yと)の間 ・マクロ定義本体(つまり右側)の 一番目の括弧と二番目の括弧の間 ・二番目の括弧とxの間  以下同様に・・・・・・・・・・・・・ 呼び出す場合も、c=mymul(a,b)と呼び出す場合に、 ・=とmymulの間 ・mymulと( の間 ・( と a の間 ・aと,(カンマ)の間  ・・・・・・ これらのどこに入れてよいのか、 よろしくお願いいたします。 全角で書いてあるところがあります。例としてあげた定義の実益については問わないことにしましょう。

noname#2004
noname#2004

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

空白を入れられないのは、mymul と ( の間だけです。 ( があると、それに対応する ) が現れるまでは、勝手に分断されることはありません。 入れられるところ全てに空白を入れると、   #  define mymul( x , y )  ( ( x ) * ( y ) ) こんな感じになります。 ● # 前後の空白 古いC(K&Rのころ)ではダメでしたが、ANSI C 準拠のコンパイラではOKです。 これによって、#if のネストにインデントをつけることができます。 例: #if DEBUG #  define ERROR(e) error(e) # else #  define ERROR(e) # endif あるいは #if DEBUG   #define ERROR(e) error(e) # else   #define ERROR(e) # endif ※「空白」はタブも含みます。

noname#2004
質問者

お礼

>( があると、それに対応する ) が現れるまでは、勝手に分断されることはありません。 特にこのことが心配でした。 対応する括弧が現れるまでは大丈夫なんですね。 ありがとうございます。

関連するQ&A

  • C言語での関数形式マクロの使い方

    前の質問No.300834(関数形式マクロと空白の質問)と関連します。 関数形式マクロで、引数として入れるものは、変数でなくて型名でも構わないのでしょうか。 例えば、 #define mymul(t,x,y) ((t)(x)*(t)(y)) と定義すると、 mymul(int, 5.0, 3.5) と呼び出すと、 ((int)(5.0)*(int)(3.5)) に置き換える、 (intでキャストした 5.0 と、intでキャストした 3.5 をかける) というのは可能でしょうか。 あと、関数形式マクロの呼び出しは、実行部分でなくてもよいのでしょうか。関数頭部(関数の本体の前の部分)で呼び出せますか。 例えば #define ARGUMENT3(t1,v1,t2,v2,t3,v3) ¥ (t1 v1, t2 v2, t3 v3) #define a_func b_func ARGUMENT3 と定義しておいて、 関数を定義するときに、 int a_func(int,x, char*,cp, int**,ypp) { ・・・・ } こんなことをすると、 int b_func(int x, char *cp, int **ypp) { ・・・・ } に置き換わりますか? もし、ARGUMENT3の定義を、ARGUMENT3の後の括弧の中のカンマのつけ方を変えて、 #define ARGUMENT3(t1 v1,t2 v2,t3 v3) ¥ (t1 v1, t2 v2, t3 v3) とし、 int a_func(int x, char* cp, int** ypp) { ・・・・ } こうすると、先ほどのようなb_funcの関数頭部に変換することは出来ませんか? (関数形式マクロでこのような空白の入れ方をしてよいのでしょうか。)

  • 関数形式マクロ

    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); }

  • 「解きながら学ぶC言語」という本の問題8-3

    2つの値の大きい方の値を返すマクロを以下のように定義! #define max(x, y) ((x) > (y) ? (x) : (y)) このマクロを利用してmax(max(max(a, b), c), d)を展開すると ((((((a) > (b) ? (a) : (b))) > (c) ? (((a) > (b) ? (a) : (b))) : (c))) > (d) ? (((((a) > (b) ? (a) : (b))) > (c) ? (((a) > (b) ? (a) : (b))) : (c))) > (d)) このようになる。 そこで質問ですが、展開後の最後の部分、 (c))) > (d))は、不等号(>)ではなくコンマ(:)ですよね? これは参考書のミスということでよろしいんでしょうか? 少々腑に落ちないので質問させていただきました。 長々と長文申し訳ございません。 ご回答宜しくお願いします!

  • ユーザ定義関数とマクロ関数で動作が一致しない

    なぜか同じ内容であるはずのユーザ定義関数とマクロ関数で動作が 異なってくるのですがそんなことはあり得るのでしょうか? ちなみにマクロ関数の方でうまくいきユーザー定義関数だとうまくいきません。 マクロ関数の方は以下のようなものです。 int iw; #define iswap(a,b) {iw=a;a=b;b=iw;} ユーザ定義関数の方は int iw; void iswap(a,b){ iw=a;a=b;b=iw } です。これらのものは違う動作をするものなのでしょうか? プログラム自体は完成しているのですがどうしても納得がいきません。 回答・アドバイスよろしくお願いします。

  • 引数をつけたマクロ定義とは

    引数つきマクロ宣言って、どういった場面で使うのでしょうか? 例えば #define abc(a) a*a と定義している場合 x=abc(a) のabc(a)がa*aに変わる。 でも、こんなことしたら abc(a)関数を呼び出せなくなるのでは? 要するに、「引数つきのマクロ定義が ある理由などを、説明していただければと思います。

  • C++:ある関数を定義するときに別の関数を用いて定義はできないのですか。

     Visual C++を使っています。  以下のように関数func2において関数func1を使いたいのですがコンパイルするとポインタがどうのこうのと言ってきます。  書き方が間違っているのでしょうか、別にいい方法がありましたら教えてください。参考書はありますので、どの項目を見ればよいと言うアドバイスでも結構です。 const double a=100.0; //グローバル変数aを定義 //関数func1を定義 double func1(double x){ return exp(x); } //関数func2を定義 double func2(double y){ return func1(a)*exp(y);//func(a)は係数。 } 実際はfunc1とfunc2はもっと複雑な形なのでどうしても別々に定義したいです。

  • c言語の関数定義について

    次の関数定義を考える. int f(int x) {if (x > 0) {return x * f(x-1);} else {return 1;} } この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ.ただし,オーバーフロー(overflow) については考慮しなくてよい. ”この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ”って理解できません、どのように定義したいいか、ご教授お願いします。

  • c#のマクロ定義について

    C言語でマクロ定義の場合以下のようにヘッダファイルに#defineで定義しますが、C#の場合どのようにすればいいのでしょうか。 C言語の場合 *** test.h *** #define TEST 5 C#の場合 public const int TEST = 5; //これでいいの? 専用のclassを用意するの? 初歩的な質問ですが宜しくお願い致します。

  • 二つの値を交換する関数形式マクロ

    type型の二つの値を交換する関数形式マクロの定義について、 どなたか教えて頂けませんか?   change(type, a, b) たとえば、int型の変数a, bの値が10, 20である場合、 change(int, 10, 20)を呼び出した後は、a, bには20と10が 格納される、というものです。

  • マクロ内での変数定義

    C言語においてのマクロの仕様を教えてください。 (1)マクロ内でコメントは不可なのでしょうか? (2)マクロ内で変数定義は不可なのでしょうか?  マクロは実行された場所に展開されるだけの認識ですので、  マクロ内で変数宣言されている場合、関数の先頭でしかマクロが使えない? よろしくお願い致します。 ----以下作成コード---- #define TESTMACRO(result,a,b) \ do{ \ int tmpData = 5; \ if( a=0){ \ result = -1; \ continue; \ } \ if( b=0){ \ result = -1; \ continue; \ } \ result = a*b*100; \ }while(0) int main(){ int result = 0; /* 他の処理 */ TESTMACRO(result,a,b);  /* 結果resultのログ表示 */ }

専門家に質問してみよう