C言語学習シリーズ:プリプロセッサとメモリ管理

Cプリプロセッサツールは、置換テキストのコンパイルプロセスである、彼らは、コンパイラは前処理が前に実際のコンパイルに必要な完成させます。これは、CPPと略記コンパイラの一部ではありません。

すべての注文は、先頭にシャープ記号(#)でプリプロセッサです。すべてのプリプロセッサディレクティブを次のように

プリプロセッサディレクティブ          説明
#define マクロ定義
#含める ヘッダファイルを参照
#undefの 定義されたマクロをキャンセル
#ifdefの マクロが定義されている場合は、trueを返します
#ifndefの マクロが定義されていない場合は、trueを返します
#if 与えられた条件がtrueの場合、以下のコードはコンパイルされ
#そうしないと 代替の#if
#elifの 前回の#if与えられた条件が真でない場合、現在の状態は、次のコードはコンパイルされ、真であります
#endifの #の終わりであれば......#他の条件付きコンパイルブロック
#エラー 標準エラー、エラーメッセージに直面したとき
#pragma 標準化された方法を使用して、コンパイラにコンパイラに特別な命令を出しました

 

プリプロセッサの例

#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif

このディレクティブは、CPPにメッセージが定義されていない場合にのみ、それが定義されているメッセージを伝えます。

#ifdef DEBUG
   /* 调试语句 */
#endif

あなたは文が実行される処理を、DEBUGを定義する場合は、このディレクティブは、CPPを伝えます。コンパイラはgccに渡された場合は、コンパイル時には、 - DDEBUGの  スイッチは、このコマンドは便利です。これは、DEBUG(デバッグ)は、コンパイル時にデバッグいつでもオンまたはオフにすることができます定義されています。

 

定義済みマクロ

以下ASNI Cマクロを事前に定義するため、のための#defineすることなく、直接使用されるが、変更されないことができます。

マクロ     説明
__日付__       現在の日付、「MMM DD YYYY」形式で表現文字定数。
__時間__  現在の時刻、「HH:SS:MM」の文字定数表現形式。
__ファイル__  これは、現在のファイル名、文字列定数が含まれています。
__ライン__  これは、現在の行番号、小数点定数が含まれています。
__STDC__            コンパイル時ANSI標準のコンパイラは、1と定義したとき。

 

プリプロセッサ演算子

マクロ継続演算子(\) オペレータは改行マクロ定義許可されています。

#define max(x,y) \
    (x)>(y)? (x) : (y)

多くの場合、量子化列演算子(#)、操作者がすることができるマクロパラメータ文字列定数に変換します。

#define  message_for(a, b) printf(#a " and " #b ": We love you!\n")

トークン貼り付け演算子は(##)、オペレータは、二つの別々のタグの定義は、(マクロ定義は、識別子をマークされている)マクロ内のタグに結合されることができ:

#include <stdio.h>

#define tokenpaster(n) printf ("token" #n " = %d", token##n)

int main(void)
{
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}
根据宏定义,tokenpaster(34) 即 printf("token34 = %d", token34);

定義()演算子

プリプロセッサは、 定義された   オペレータが識別子の#defineを使用して定義されているかどうかを決定するために使用される定数式です。指定した識別子が定義されている場合、値が(非ゼロ)が真です。指定した識別子が定義されていない場合、値は(ゼロ)偽です。

 

パラメータ化されたマクロ

関数は、パラメータ化されたマクロによってシミュレートすることができます。

#include <stdio.h>

#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void)
{
   printf("Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

パラメータを持つマクロを使用する前に、事前に定義されたマクロに加えなければなら  #defineし  た命令の定義を、パラメータリストは括弧で囲まれている、としなければならないすぐにマクロ名の後ろに。スペースはマクロ名と左括弧の間で許可されていません

 

Cの動的メモリ管理

メモリ割り当ておよび管理機能(ヘッダファイルstdlib.hで):

関数原型 説明
void *型のcalloc(int型NUM、int型のサイズ);  動的メモリサイズが連続空間のNUM長を割り当て、各バイトは0に初期化されます。その結果は、NUMが割り当てられているので*メモリのサイズは、長さがバイト、各バイトの値は0です。
ボイドのない(void *型アドレス)。  この機能は、メモリ空間のリリースによって指されたメモリブロックのアドレスが動的に割り当てられているリリース。
void *型のmalloc(int型の数値)。  データの格納に使用ヒープ内のメモリ空間の指定された量を、調剤。このメモリ空間は、関数の実行が完了した後、それらの値が不明で初期化されません。
void *型のrealloc(void *型アドレス、INT NewSizeパラメータ)。  この関数は、メモリへのメモリ拡張再割り当て  NewSizeパラメータを

注: void *型のタイプは、ポインタの未定種類を表しています。C、Cは所定でvoid *型を入力++ キャスト型変換ポインタの他のタイプに。

 

動的なメモリ割り当て

:長さが格納される事前に知られていない場合には、必要なメモリの文字サイズにポイントが定義されていない、それは続いてメモリ割り当て要求に応じて再調整することができるポインタを定義する必要があります

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
   char *p;
   /* 动态分配内存 */
   p = (char *)malloc( 200 * sizeof(char) );
   //p = (char *)calloc(200, sizeof(char));
   if(p == NULL)fprintf(stderr, "错误-无法分配所需的内存\n");
   else strcpy(p, "Zara ali a student in class 10th");
   printf("Description: %s\n", p);
}

リサイズメモリ

プログラムの終了は、オペレーティングシステムが自動的にプログラムに割り当てられたすべてのメモリを解放すると、しかし、必要でないとき、あなたは、関数を呼び出す必要があり、そのメモリを推奨  無料()  メモリを解放します。または関数を呼び出すことによって  のrealloc()  割り当てられたメモリブロックのサイズを増減します:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char *p;

   /* 动态分配内存 */
   p = (char *)malloc( 30 * sizeof(char) );

   if( p == NULL )fprintf(stderr, "错误-无法分配所需的内存\n");
   else strcpy( p, "Zara ali a student.");

   /* 假设想要存储更大的描述信息,使用realloc函数 */
   p = (char *) realloc( p, 100 * sizeof(char) );

   if(p == NULL )fprintf(stderr, "错误-无法分配所需的内存\n");
   else strcat( p, "She is in class 10th");

   printf("Description: %s\n", p);

   /* 使用 free() 函数释放内存 */
   free(p);
}

そうしない場合はそのメモリ不足のため、strcatは()関数がエラーを生成し、Pに多くのメモリを再割り当て。

公開された161元の記事 ウォン称賛90 ビュー50000 +

おすすめ

転載: blog.csdn.net/qq_42415326/article/details/104027506