defineとtypedef、const、inlineの違い
4907 ワード
defineとtypedefの違い
defineはマクロ定義で、typedefは名前の変更です.
役割ドメインが異なる typedef
(1)すべての関数の外に置くと、その役割ドメインはその定義からファイルの最後までです.
(2)ある関数内に置くと、定義ドメインは定義からその関数の最後までである. #define
(1)ある関数内においても、すべての関数以外においても、役割ドメインは定義からファイル全体の最後までである.
(2)同一のコンパイルユニット内部において、異なるネーミングスペース内においてもその作用範囲は変わらない.すなわち、定義からファイル終了までである.
defineとconstの違い
(1)マクロにはタイプチェックがなく、文字の置換のみであり、境界効果により文字の置換時に予想外のエラーが発生する可能性がある;const定数には厳格なタイプチェックがある
(2)マクロ定数はメモリ空間を開かず,const定数はメモリ空間を開く.
(3)統合されたデバッグツールによってはconst定数をデバッグできますが、マクロ定数をデバッグできません.
(4)c++におけるconstがマクロに完全に取って代わる
記号名ASPECT_RATIOはコンパイラに見られなかったかもしれないし、コンパイラがソースコードの処理を開始する前にプリプロセッサによって移動されたかもしれない.そこでASPECT_RATIOは記号表に入っていない可能性があります.この定数を使用してコンパイルエラーを取得すると、このエラー情報はASPECT_ではなく1.653に言及します.RATIO.ASPECT_の場合RATIOは、あなたが書いたヘッダファイル以外に定義されていますが、1.653とどこから来たのかは概念がありません.
defineとinlineの違い
(1)インライン関数はマクロ関数と同様に呼び出された箇所でコード展開され、パラメータ圧着スタック、スタックフレームの開封と回収を省き、結果的に戻るなどしてプログラムの実行速度を向上させる.しかしインライン関数はコンパイル時に展開され、マクロはプリプロセッサによってマクロが展開される
(2)インライン関数はパラメータタイプをチェックし、デバッグ可能を実行し、マクロ定義は関数パラメータをチェックせず、デバッグ不可を実行するので、インライン関数の方が安全である.
(3)マクロは関数ではなく,inline関数は関数である.
(4)マクロは定義時にマクロパラメータを注意深く処理する(一般的にはパラメータを括弧で囲む).
(5)ただし,インラインはコード膨張(コピー)の代わりにメモリを消費する.
(6)コンストラクション関数/コンストラクション関数はインラインであってもよいが,必要ない.
(7)マクロをカスタマイズするときは、定義済みマクロと重複しないように注意してください.そうしないと定義されません.
マクロ関数を書く場合は、マクロ内のすべての実パラメータにカッコを付ける必要がありますが、カッコを付けると不思議なことに遭遇します.
define#と##
define文の#はパラメータを文字列化し、##は2つのパラメータを接続して1つの全体にします.
CONS(2,3)の実際の表現は,整数値2 e 3,すなわち10進数2000である.
defineはマクロ定義で、typedefは名前の変更です.
typedef int int_32;
typedef void(*Func)(int); // Func
#define PI 3.1415 // ;
#define max(x,y) ((x)>(y)?(x):(y))
役割ドメインが異なる
(1)すべての関数の外に置くと、その役割ドメインはその定義からファイルの最後までです.
(2)ある関数内に置くと、定義ドメインは定義からその関数の最後までである.
(1)ある関数内においても、すべての関数以外においても、役割ドメインは定義からファイル全体の最後までである.
(2)同一のコンパイルユニット内部において、異なるネーミングスペース内においてもその作用範囲は変わらない.すなわち、定義からファイル終了までである.
defineとconstの違い
(1)マクロにはタイプチェックがなく、文字の置換のみであり、境界効果により文字の置換時に予想外のエラーが発生する可能性がある;const定数には厳格なタイプチェックがある
(2)マクロ定数はメモリ空間を開かず,const定数はメモリ空間を開く.
(3)統合されたデバッグツールによってはconst定数をデバッグできますが、マクロ定数をデバッグできません.
(4)c++におけるconstがマクロに完全に取って代わる
#define ASPECT_RATIO 1.653 (#define ;)
記号名ASPECT_RATIOはコンパイラに見られなかったかもしれないし、コンパイラがソースコードの処理を開始する前にプリプロセッサによって移動されたかもしれない.そこでASPECT_RATIOは記号表に入っていない可能性があります.この定数を使用してコンパイルエラーを取得すると、このエラー情報はASPECT_ではなく1.653に言及します.RATIO.ASPECT_の場合RATIOは、あなたが書いたヘッダファイル以外に定義されていますが、1.653とどこから来たのかは概念がありません.
defineとinlineの違い
(1)インライン関数はマクロ関数と同様に呼び出された箇所でコード展開され、パラメータ圧着スタック、スタックフレームの開封と回収を省き、結果的に戻るなどしてプログラムの実行速度を向上させる.しかしインライン関数はコンパイル時に展開され、マクロはプリプロセッサによってマクロが展開される
(2)インライン関数はパラメータタイプをチェックし、デバッグ可能を実行し、マクロ定義は関数パラメータをチェックせず、デバッグ不可を実行するので、インライン関数の方が安全である.
(3)マクロは関数ではなく,inline関数は関数である.
(4)マクロは定義時にマクロパラメータを注意深く処理する(一般的にはパラメータを括弧で囲む).
(5)ただし,インラインはコード膨張(コピー)の代わりにメモリを消費する.
(6)コンストラクション関数/コンストラクション関数はインラインであってもよいが,必要ない.
(7)マクロをカスタマイズするときは、定義済みマクロと重複しないように注意してください.そうしないと定義されません.
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))
マクロ関数を書く場合は、マクロ内のすべての実パラメータにカッコを付ける必要がありますが、カッコを付けると不思議なことに遭遇します.
int a = 5, b = 0;
CALL_WITH_MAX(++a, b); // a
CALL_WITH_MAX(++a, b+10) // a
define#と##
define文の#はパラメータを文字列化し、##は2つのパラメータを接続して1つの全体にします.
#define STR(s) #s
#define CONS(a,b) (int)(a##e##b)
int main() {
cout << (STR(vck)) << endl;
cout << CONS(2, 3) << endl;
}
CONS(2,3)の実際の表現は,整数値2 e 3,すなわち10進数2000である.