typedefと#defineの違い

typedefは型をエイリアスし、使用します;終了、

#defineは、コンパイル前処理命令の単なるマクロ置換です。

#define pint int *

typedef int * Pint;

const pint a、b;

const PRINT a、b;

違いを比較する

 

 

1)#defineは前処理命令です。コンパイルと前処理中に単純に置き換えられます。意味が正しく組み込まれているかどうかに関係なく、正しいかどうかはチェックされません。拡張されたソースプログラムがコンパイルされた場合にのみ、エラーが検出され、エラーを報告します。例:#define PI 3.1415926プログラムでは、area = PI * r * rは3.1415926 * r * rに置き換えられます。#defineステートメントで9を文字gとして書き込むと、前処理も行われます。2)typedefはコンパイル時に処理されます。独自のスコープ内の既存の型にエイリアスを提供しますが、関数定義内ではtypedef指定子を使用できません。3)typedef int * int_ptr;および#define int_ptr int *はint_ptrを使用してint *を表しますが、2つは異なります。前述のように、#defineは前処理中に単純な置換を実行し、typedefは単純な置換ではありませんが、変数を定義するのと同じ方法で型を宣言することです。つまり、//(xzgyb(Old Bodhidharma))を参照#define int_ptr int * int_ptr a、b; // int * a、bと同等です;単純なマクロ置換typedef int * int_ptr; int_ptr a、b ; // a、bはすべてintへのポインタであり、typedefはint *の新しいニーモニックを導入します。これは、次の点が当てはまる理由も説明します// QunKangLi(メンテナンスコストはプログラマの創造性の2乗に比例します) typedef int * pint; #define PINT int * Then:const pint p; // pは変更できませんが、pが指すコンテンツは変更できますconst PINT p; // pは変更できますが、pが指すコンテンツは変更できません。Pintはポインター型ですconst pint pはポインターpをロックしますpは変更できず、const PINT pはconst int * p lockはポインターpが指すオブジェクトです。3)#defineはステートメントではないことに気づいたかもしれませんが、行の最後にセミコロンを追加しないでください。追加しないと、セミコロンに置き換えられます。別の記事I. typedefの使用C / C ++言語では、typedefは一般的に識別子とキーワードのエイリアスを定義するために使用されます。これは言語コンパイルプロセスの一部ですが、実際にはメモリ空間を割り当てません。例:typedef int INT; typedef int ARRAY [10]; typedef(int *)pINT; typedefはプログラムの可読性と識別子の柔軟性を高めることができますが、「直感的でない」などの欠点もあります。第2に、#define#defineの使用法は、マクロ定義ステートメントであり、通常は定数を定義する(パラメーターなし、パラメーターありを含む)ために使用されるほか、「一見優しくて遅れている」これらのマクロを実装します。コンパイルプロセス中には実行されませんが、これ(前処理プロセス)の前に完了していますが、潜在的なエラーやその他のコードメンテナンスの問題を見つけることも困難です。その例は次のとおりです。#define INT int#define TRUE 1#define Add(a、b)((a)+(b));#Loop_10を定義(int i = 0; i <10; i ++)Scott MeyerのEffective C ++の第1条には、#defineステートメントの欠点の分析と、優れた代替方法があります。これを参照してください。3つ目は、#typedefと#defineの違いは上記の概念から基本的には明確です。typedefは、可読性を高めるための識別子の新しい名前(単なる個人名)であり、#defineはもともとCでした定数を定義するために、C ++では、const、enum、inlineの出現が徐々にエイリアスツールになりました。typedefでどちらを使用するのが適切かを判断するのが簡単な場合があります。#define INT intなどのステートメントはtypedefで実行できますが、どちらが適切ですか。この文は多くの初期のCコンパイラでは違法であるため、typedefsの使用を推奨していますが、現在のコンパイラは拡張されています。typedefは一般的に長いタイプのキーワードとエイリアスを定義するために使用されますが、できるだけ互換性を保つために、一般的に#defineのタスクに従って「読み取り可能な」定数といくつかのマクロステートメントを定義します。マクロ定義は単純な文字列置換(インプレース展開)ですが、typedefはインプレース展開ではありません。その新しい名前には特定のカプセル化があり、新しく名前を付けた識別子には変数をより簡単に定義する機能があります。上記の最初の大きなコードの3行目を見てください:typedef(int *)pINT;および次の行:#define pINT2 int *同じ効果?違うよ!実際の違いを参照してください:pINT a、b;の効果はint * a;と同じです; int * b;は、2つの整数ポインター変数が定義されていることを意味します。pINT2 a、b;の効果は、int * a、b;と同じです。これは、整数ポインター変数aと整数変数bが定義されていることを意味します。注:行末もあり、数字の違い!
————————————————
著作権声明:この記事はCSDNブロガー "21aspnet"によるオリジナルの記事であり、CC 4.0 BY-SAの著作権契約に従っています。オリジナルのソースリンクとこの声明を添付して転載してください。
元のリンク:https://blog.csdn.net/21aspnet/article/details/6723915

 

おすすめ

転載: www.cnblogs.com/pquan/p/12730000.html