事前処理に関する知識
2915 ワード
プリプロセッシングはプリコンパイルとも呼ばれ、コンパイルのために予備作業を行い、主にコードテキストの置換作業を行い、#の先頭の命令を処理するために使用されます.
1.C/C++ヘッダファイルのifdef/define/endifの役割はどれらがありますか?
1つのプロジェクトに2つのCファイルが存在し、両方のファイルに同じヘッダファイルが含まれている場合.コンパイルすると、この2つのファイルが1つの実行可能ファイルにコンパイルされると、多くの宣言競合が発生する可能性があります.解決策は、ヘッダーファイルの内容をifndefとendifの中に置くことです.フォーマットは以下の通りです.
標識の命名規則は一般的にヘッダーファイルが大文字で、前後に下線を引いて、ファイルの中の「.」をつけます.下線にもなりますstdio.h.
2.#defineにはどのような欠陥がありますか?
マクロ定義は前処理フェーズで行われるため、主に文字列置換作業を行うため、いくつかの固有の欠陥があります.タイプチェックはできません.マクロ定義は、コンパイル前に文字置換を行います.コンパイル時にのみタイプが一致するかどうかを確認できるため、タイプチェック機能はありません. 優先度の違いはよマクロ定義に副作用がある可能性がある. 単一ステップデバッグできません はコード膨張 を引き起こす. C++では、マクロはクラスのプライベートメンバーを操作できません.
3.変数が符号数があるか、符号数がないかをどのように判断しますか.方法一: 方法2: 方法3:
4.sizeofを使用しないで、int占有バイト数と構造体メモリオフセット量をどのように計算しますか?
ANSI C規格では、0の定数を任意のタイプのポインタに強制的に変換し、変換結果を空のポインタにすることができます.0に対して(type*)を取った結果、ポインタtypeの空のポインタに変換されます.これを利用してfieldフィールドにアクセスするのは違法であるが、マクロ置換はコンパイル前に発生するため、コンパイラは構造体コンテンツレイアウトに基づいて、アドレス0に対するfieldのポインタのオフセット量を算出するだけである.
5.列挙、typedef、constとマクロ定義の違いは何ですか?列挙は大量の相関定数を定義することができ、自動付与機能を有し、列挙定数はエンティティの一種であり、役割ドメイン、値などの特徴を有する.また、列挙定数はコンパイルフェーズで値を決定し、コンパイラでは一般的に列挙定数をデバッグすることができ、これらの特徴はマクロ定義に備わっていない. typedefは、オブジェクト(基本タイプまたはカスタムタイプ)に別名を付けて可読性を増加させることができる.タイプチェック機能と役割ドメインがあります.マクロ定義は単純な置換にすぎず,上記の特徴を備えていない.typedefとマクロ定義は、ポインタを処理する際に大きな違いがあることに注意してください. const定数はデータ型を有し、プログラムのデータセグメントに存在し、呼び出しを伝達することができる.コンパイラはconst定数のセキュリティチェックを行うことができます.したがって、多くのIDEはマクロ定義ではなくconst定数をサポートします.
6.マクロ定義とインライン関数の違いは何ですか.
マクロコード自体は関数ではありませんが、関数に似ています.プリプロセッサは関数呼び出しの代わりにマクロコードをコピーする方法で、パラメータスタックを省き、アセンブリ言語を生成するCALL呼び出し、パラメータを返し、returnを実行するなどのプロセスを省き、速度を向上させます.
インライン関数は、呼び出し元コードにコードが挿入される関数です.インライン関数も万能ではなく、関数内のコードの簡単な関数でのみ使用され、複雑な構造制御文は含まれず、インライン関数自体が直接再帰関数を呼び出すことはできません.
両者の違いは、マクロ定義は、前処理段階でコード置換が行われ、インライン関数は、コンパイル段階でコード が挿入する.マクロ定義にはタイプチェックはありませんが、インライン関数にはタイプチェックがあります.
引用:インライン関数と一般関数の違い?
C++言語のインライン関数は通常の関数と同じですが、コンパイラはインライン関数を呼び出す場所ごとにインライン関数を展開し、関数呼び出しのオーバーヘッドを回避し、マクロメカニズムの欠陥を回避します.Nでインライン関数が呼び出されると、この関数はセグメントコードに対してN回展開される.インライン関数体が大きすぎると、コンパイラはインライン方式を放棄します.
1.C/C++ヘッダファイルのifdef/define/endifの役割はどれらがありますか?
1つのプロジェクトに2つのCファイルが存在し、両方のファイルに同じヘッダファイルが含まれている場合.コンパイルすると、この2つのファイルが1つの実行可能ファイルにコンパイルされると、多くの宣言競合が発生する可能性があります.解決策は、ヘッダーファイルの内容をifndefとendifの中に置くことです.フォーマットは以下の通りです.
`#ifndef <_stdio_h_>
#define <_stdio_h_>
...
#endif
標識の命名規則は一般的にヘッダーファイルが大文字で、前後に下線を引いて、ファイルの中の「.」をつけます.下線にもなりますstdio.h.
2.#defineにはどのような欠陥がありますか?
マクロ定義は前処理フェーズで行われるため、主に文字列置換作業を行うため、いくつかの固有の欠陥があります.
3.変数が符号数があるか、符号数がないかをどのように判断しますか.
#define ISUNSIGNED(a) (a>=0 && ~a>=0)
#define ISUNSIGNED_TYPE(type) ((type) - 1 > 0)
typedef unsigned type;
int main(){
unsigned a = 10;
a = a | (1 << 31);
if(a > 0)
printf("signed
");
else
printf("unsigned
");
}
typedef unsigned type;
int main(){
type a = -1, b = 100;
if(a - b > 0)
printf("signed
");
else
printf("unsigned
");
}
4.sizeofを使用しないで、int占有バイト数と構造体メモリオフセット量をどのように計算しますか?
#define OFFSET(type, field) ((size_t)& ( ((type*)0)->field ) )
ANSI C規格では、0の定数を任意のタイプのポインタに強制的に変換し、変換結果を空のポインタにすることができます.0に対して(type*)を取った結果、ポインタtypeの空のポインタに変換されます.これを利用してfieldフィールドにアクセスするのは違法であるが、マクロ置換はコンパイル前に発生するため、コンパイラは構造体コンテンツレイアウトに基づいて、アドレス0に対するfieldのポインタのオフセット量を算出するだけである.
5.列挙、typedef、constとマクロ定義の違いは何ですか?
6.マクロ定義とインライン関数の違いは何ですか.
マクロコード自体は関数ではありませんが、関数に似ています.プリプロセッサは関数呼び出しの代わりにマクロコードをコピーする方法で、パラメータスタックを省き、アセンブリ言語を生成するCALL呼び出し、パラメータを返し、returnを実行するなどのプロセスを省き、速度を向上させます.
インライン関数は、呼び出し元コードにコードが挿入される関数です.インライン関数も万能ではなく、関数内のコードの簡単な関数でのみ使用され、複雑な構造制御文は含まれず、インライン関数自体が直接再帰関数を呼び出すことはできません.
両者の違いは、
引用:インライン関数と一般関数の違い?
C++言語のインライン関数は通常の関数と同じですが、コンパイラはインライン関数を呼び出す場所ごとにインライン関数を展開し、関数呼び出しのオーバーヘッドを回避し、マクロメカニズムの欠陥を回避します.Nでインライン関数が呼び出されると、この関数はセグメントコードに対してN回展開される.インライン関数体が大きすぎると、コンパイラはインライン方式を放棄します.