http://c.biancheng.net/view/187.html
C言語ができる#define
定数を表す識別子を定義します。その特徴は以下のとおりです。コンパイル済みのこのシンボルは存在しません後に定義された識別子は、メモリのためだけの一時的な兆候を考慮していません。
プリコンパイル済みの既知の前処理。プリコンパイルコンパイルしますが、コンパイルの前治療ではありません。この操作は、正式なシステムの前にコンパイラによって自動的に行われます。
#define
定義された識別子として一般的な形式:
#define 标识符 常量 //注意, 最后没有分号
#define
そして#include
、ちょうど先頭に「#」のように。先頭に「#」はディレクティブを前処理されている場合、#は、例外を定義していません。
#define
また、マクロと呼ばれるマクロ定義、定義された識別子マクロ名として知られています。識別子の命名、変数の命名規則の前で話すことは同じです。#define
関数の後にその識別子として定義される定数です。定義されると、プログラムは直接定数識別子を表すために使用することができます。変数の定義は類似していないですか?しかし、区別するために!変数名は、変数であることを示しているが、マクロ名は一定であることを示します。あなたは変数に値を割り当てるが、一定の値を与えることはできません。
定数マクロは、数字、文字、文字列、式で表すことができます。最も一般的に使用されるが、デジタルです。
だから、ときに、プログラムは、マクロ定義を使用しますか?マクロ定義で、それは何が良いのですか?私たちは、デジタルに直接書き込みませんか?なぜそれを表す識別子番号を使うのか?
マクロ定義の最大のメリットは、「プログラムを変更するのは簡単。」です マクロを使用して定義する代わりに頻繁にプログラムで使用する定数aのマクロを使用することができます。なお、「しばしば」を使用。それは一定の値を変更したい場合したがって、いずれかによって、プログラム全体のいずれかを変更する必要がなく、定数は、単にマクロ定義を変更することができます。そして時に短く意味のある識別子と交換することができるマクロは、そのようなプログラミング時間の長い定数の使用がより便利に、より少ないエラーが発生しやすくなります。このように、マクロ定義の利点は便利で保守が容易です。
プログラムはそれのマクロ定義をどのように扱うか、プリコンパイル時にありますか?それとも、プリプロセッサディレクティブをどのように扱うかありますか?
実際には、操作が交換するプリコンパイルされたシンプルな「テキスト」を行っています。マクロ定義、事前コンパイル時のすべての出現、「識別子」プログラムは、この「定数」と呼ばれる「マクロ置換」または置き換えに完全に配置されます「マクロ展開を。」公式のコンパイルが完了した後、次に置き換えます。だから、実際には、最初の公式のコンパイルの前に、プリコンパイルされた2つの操作を行ったときに「コンパイル」をクリックしたとき。する#include <stdio.hの>は、このような第1の前処理は、単にすべてのヘッダファイルstdio.hのを使用する場合、「テキスト」は、番組の内容を置換することの#include <stdio.hの>この行は、公式コンパイル。
なお、命令はステートメントを前処理されていない、それがセミコロンに続くことはできません。これはよくある間違い多くの初心者です。無セミコロンの後ろの#include。
#defineマクロ定義は、一般的に一緒に機能の外、及びの#include書き込みに書き込まれます。もちろん、そこに構文エラーで書かれた何も機能はありませんが、一般的にあまり書き込み。完全にプレイスクリプトのラインからの#defineの#defineスコープ。あなたはその範囲を終了したい場合は#undefのコマンド形式を使用することができます。
#undef 标识符
あなたがマクロを終了したいという識別子はundef戻ります。例えば、前の手順の冒頭でマクロがMに定義されて定義し、元のスコープは、プログラムの終わりまでだったが、我々はプログラム中の文のどこかを追加した場合:
#undef M
そして、このマクロスコープは終わりました。#undefのはあまり使用され、私たちは理解する必要があります。
変数識別子名をオフに区別するためには、識別子はすべて大文字を表し通例です。配列内のほとんどの場所で定義されたマクロは、配列の長さを指定します。プログラムを書いてみましょう:
# include <stdio.h>
# define NUM 5
int main(void)
{
int i, j = NUM;
int a[NUM] = {0};
printf("请输入%d个数:", j);
for (i=0; i<NUM; ++i)
{
scanf("%d", &a[i] );
}
for (i=0; i<NUM; ++i)
{
printf("%d\x20", a[i]);
}
printf("\n");
return 0;
}
出力は次のようになります。
请输入5个数:5 4 3 2 1
5 4 3 2 1
NUMマクロが定義され、それ以降の一定の(ない変数)を表します。また、二重引用符プログラムによってマクロは、マクロを前処理に交換されていない場合。二重引用符で示されるC言語、以来文字列です。以下を見て、プログラムを書きます:
# include <stdio.h>
# define PI 3.14159
int main(void)
{
double r, s;
printf("请输入圆的半径:");
scanf("%lf", &r); //scanf中, double只能用%lf
s = PI * r * r;
printf("s=PI*r^2 = %.6f\n", s); //PI不会被宏替换
return 0;
}
出力は次のようになります。
请输入圆的半径:1
s=PI*r^2 = 3.141590