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