マクロ機能:
#define 宏名(a,b,c,...) a+b*c
マクロ関数は実際の関数ではなく、関数のように使用されるパラメータを持つマクロです。
コードでマクロ関数を使用する場合、前処理中に 2 回の置換が行われます。1 回目はマクロ関数がコードの文字列とその背後にある式に置き換えられ、2 回目はマクロ関数のパラメータが式に置き換えられます。 。
マクロ関数の背後にあるコードが複数行ある場合は、中括弧を使用してコードを保護できます。
#define マクロ名(a,b,c,...) {コード 1; コード 2; ...}
マクロ関数の背後にあるコードを直接折り返すことはできません。コードが長すぎる場合は、継続文字を使用して改行できます。
#define マクロ名(a,b,c,...) { \
コード 1; \
コード 2; \
... \
}
通常関数とマクロ関数の長所と短所:
マクロ機能の利点:
1. 実行速度が速く、実際の関数呼び出しではなくコード置換であり、パラメータの受け渡し、ジャンプ、
戻り値。
2. パラメータの種類をチェックしないため、汎用性が高くなります。
マクロ機能の欠点:
1. これは実際の関数呼び出しではなくコード置換であるため、使用されるたびにコードのコピーが置換され、コードの冗長性が生じ、コンパイル速度が遅くなり、実行可能ファイルが大きくなります。
2. 戻り値はなく、実行結果は 1 つだけです。
3. 型チェックが厳しくなく安全性が低い。
4. 再帰呼び出しはできません。
機能の利点:
1. コードの冗長性はなく、関数のコードはコードセグメントにのみ格納され、使用すると過去にジャンプして実行し、実行が完了したら戻ります。戻り値を追加することもできます。
2. 高いセキュリティ、パラメータの型チェックが実行されます。
3. 分割統治アルゴリズムを実装するために再帰呼び出しを行うことができます。
機能のデメリット:
1. マクロ関数に比べて実行速度が遅く、呼び出す際にパラメータの受け渡し、ジャンプ、リターンなどの処理が行われるため、非常に時間がかかります。
2. 型固有、仮パラメータの種類、および実パラメータの種類はどのようなものでなければならないか。これは普遍的に使用することはできません。
マクロ機能の使い方:
マクロ関数へのカプセル化にはどのようなコードが適していますか?
1. コード量が少なく、複数回使用してもコードセグメントに過度の冗長性が生じない。
2. 呼び出し数は多いが、実行数も多い。
3. 戻り値の要件はありません。
マクロを設計する際に留意すべき点は次のとおりです。
1. 最後にセミコロンを追加しないでください。
2. 曖昧さを避けるために括弧を追加します。
3. マクロ関数にパラメータを提供するために、自己インクリメント変数および自己デクリメント変数を使用しないでください。
malloc、free関数をカプセル化する
my_malloc my_malloc の呼び出し位置と要求されたメモリ アドレスを記録する必要があります
my_free my_freeの呼び出し位置と解放するメモリアドレスを記録する必要があります
void* _my_malloc(size_t size,const char* file,const char* func,size_t line) { void* ptr = malloc(size); printf("%s %s %d 申请了%d字节的内存,地址是%p\n",file,func,line,size,ptr); return ptr; } // 由于my_malloc必须有返回值,所以只能使用这种方式中转一下 #define my_malloc(size) _my_malloc(size,__FILE__,__func__,__LINE__) #define my_free(ptr) {\ free(ptr);\ printf("%s %s %d 释放了内存 %p\n",__FILE__,__func__,__LINE__,ptr);\ }