Page 20 定義/マクロ

定数定義

よく使う値を定数として定義しておくと、効率よくプログラミングできます。例えば、三角関数を多用するプログラムでは円周率の値を定義しておけば、便利です。定義には#defineを使用します。

#include <stdio.h>
#include <math.h>

#define PI (3.1415926535)

int main(int argc, char* argv[]){
        double x = 45;

        printf("%lf\n",sin(x*PI/180));

        return 0;
}

(コンパイル時には「-lm」を忘れないでください。 例) gcc test.c -lm)

ここで、PIはdouble型変数でも文字列"3.1415926535"でもありません。PIがコンパイル時に3.1415926535に置き換わると思ってください。数値の定義をする場合は数字に括弧をつけることが多いです。これは次のようなミスを防ぐために行われます。

#include <stdio.h>

#define XX -1
#define YY (-1)
#define ZZ 4+5

int main(int argc, char* argv[]){
        int a = 1;
        a = a + XX;   /* エラー: a = a + -1 となるため、数式の書き方として不正 */
        a = a + YY;   /* OK: a = a + (-1) は正しい記述 */
        a = a * ZZ;   /* a = a * 4+5 となり、数式としては正しいが、こういう意図で使いたかった?(掛け算の方が先に計算されます。) */
        printf("%d\n",a);

        return 0;
}

定数定義は数字以外でもできます。例えば、

#include <stdio.h>
#include <math.h>

#define PI asin(-1)
#define WRITE printf

int main(int argc, char* argv[]){
        double x = 45;

        WRITE("%lf\n",sin(x*PI/180));

        return 0;
}

のようなこともできます。

WRITE→printf、PT→asin(-1)となるため、次のソースと同じになります。

#include <stdio.h>
#include <math.h>

int main(int argc, char* argv[]){
        double x = 45;

        printf("%lf\n",sin(x*asin(-1)/180));

        return 0;
}

意味のない置き換えは混乱を招くので、使わない方がいいでしょう。また、定義が不要になったら#undefで解除できます。

#include <stdio.h>
#include <math.h>

#define PI asin(-1)
#define WRITE printf

int main(int argc, char* argv[]){
        double x = 45;

        WRITE("%lf\n",sin(x*PI/180));

        return 0;
}
#undef WRITE
/* 以降、WRITEは使用できない */

マクロ

マクロは簡単な処理を簡略表記する場合に使用されます。簡単な処理とは、関数を新たに作成するまでない処理のことです。マクロは定数定義と同じく#defineによって作成されます。

#include <stdio.h>

#define MACRO(X) ((X)*8)

int main(int argc, char* argv[]){

        WRITE("%d\n",MACRO(5));

        return 0;
}

斜体のXがリンクしています。MACRO(5)は、(5*8)となり、MACRO(-1)では、((-1)*8)となります。

#include <stdio.h>

#define MACRO(X,Y) ((X)*(Y))

int main(int argc, char* argv[]){

        WRITE("%d\n",MACRO(5,4));

        return 0;
}

戻る