C / C ++のトピック - コンパイル

+トピック:実行可能なプロセスへのテキストファイルからC ++ソースファイルの経験?

[回答]

C ++ソースファイルの場合は、テキストからの実行可能ファイルは、一般的に4つのプロセスを必要とします:

位相前処理:ファイルの関係(ヘッダ)を含むソースコードファイル、準備された文(マクロ)と代替的に分析し、プリコンパイルされたファイルの生成。

ステージをコンパイル:生成するために、特定のファイル、前処理アセンブリコードにコンパイル済み変換アセンブラファイルを

コンパイルフェーズ:マシンコードにコンパイル段階変換はアセンブラファイルを生成し、生成した再配置可能オブジェクトファイルを

リンク段階:最終的に接続するために必要な複数のオブジェクトファイルやライブラリ、実行可能オブジェクトファイル

+トピック:の二重引用符「違い」と山括弧<>を含める最初の文書について教えてください?

[回答]

コンパイラ前処理​​段階は、不整合がヘッダファイルパスを注文見つけるためだからです。

二重引用符のヘッダファイルの順序を検索:

1. コンパイラは最初のヘッダファイルの現在のプロジェクトディレクトリを探します(通常の場合、ヘッダファイルには、当社のカスタムヘッダーファイルです)

2. 次に、ヘッダファイルパスコンパイラ設定であります

3. ヘッダファイルのパスを指定されたシステム変数

角括弧のヘッダファイルの順序を検索:

1. 提供されるヘッダファイルパスコンパイラ

2. ヘッダファイルパスを指定されたシステム変数

タイトル:ソースは、実行可能ファイルを処理するには?(ブログ記事より)

[回答]

1 )プリコンパイルさ

「メインソースコードファイル前のコンパイラディレクティブの先頭に」。以下の処理ルール

1は、すべて削除します。#defineを、すべてのマクロ定義を展開します。

2 、全ての処理プリコンパイルされた命令の条件のような「など、の#if 」、「#endifの」、「の#ifdef 」、「#elifの」及び「の#else 。」

3 、プロセス「の#include の位置にファイルの内容を置き換えるために、」前のコンパイラディレクティブは、プロセスを再帰的にされて行われ、ファイルが他のファイルが含まれています。

4 すべてのコメントを削除し、 " // " "および/ ** /。"

5 保持全ての#pragma コンパイラディレクティブなど、コンパイラがそれらを使用する必要があり、:の#pragmaは、一度任意のファイルを防ぐためですが、参照を繰り返してきました。

図6に示すように行番号とファイル識別子を追加コンパイラはデバッグのために行番号情報を生成する際に、コンパイラを容易にするため、およびコンパイル時のコンパイラエラーまたは警告が生成される行番号を表示することができます。

2 )コンパイル

生成されたプリコンパイルされた後xxx.i またはxxx.ii ファイル、字句解析、構文解析、意味解析と最適化、一連の対応を形成するためにアセンブリ言語ファイルを

1 、字句解析:同様の「有限状態マシン」アルゴリズムを使用して、ソースプログラムに入力されるスキャナ文字列をトークンの系列に分割しました。

2 、構文解析:スキャナによって生成されるトークンに構文解析器、構文解析は、構文木を生成します。パーサの構文木からの出力は、式ツリー内のノードです。

3 、意味解析:ちょうどパーサ表現構文のレベルの分析を完了し、ためのセマンティックアナライザ表現、それは判断することは理にかなっている場合、その意味解析は静的意味である-分割払いでは、意味論の位相をコンパイルすることができます対応する動的セマンティクスは、実行セマンティクスで決定することができます。

4 、最適化:ソースレベルの最適化プロセス。

5 、生成されたオブジェクトコード: -アセンブラ言語表現コードジェネレータによっては、コード配列のシリーズを生成する、マシンコードターゲットに中間コードに変換します。

6 、ターゲット・コードの最適化:オブジェクト最適化されたマシンコード上記オブジェクトコード最適化:適切なアドレッシングモードを見つける代わりの変位乗算を使用して、余分な命令を削除したいです。

3 )コンパイル

マシンへのアセンブリコード命令が実行することができますマシン・コード・ファイル アセンブラ組立工程は、コンパイラに比べて、より単純で、複雑ではない文法や、意味論であるが、命令の最適化を必要としない、ちょうど11変換テーブルアセンブリ命令と機械の指示に従って、組立工程がアセンブラ完全な。それまでに生成するためにコンパイルされたオブジェクトファイル実行可能ファイル形式はほぼ同じである)xxx.o(Windowsのxxx.obj(Linuxの下に

4 )リンク

実行可能なプログラムを形成するように、異なるソース・リンクによって生成されるオブジェクト・ファイル。静的および動的リンクリンクリンクに分かれて:

1 、静的リンク:

関数およびデータは、バイナリファイルにコンパイルされます。コンパイルと実行可能ファイルをリンクしたときに、静的ライブラリの場合は、リンカ機能およびデータは、ライブラリからコピーされ、最終的な実行可能ファイルを作成するために組み合わせる他のモジュールやアプリケーションにそれらを置きます。

スペースの無駄:すべての実行可能プログラムは、必要なすべてのターゲットファイルのコピーを持っている必要がありますので、あなたが複数のプログラムが同じターゲット・ファイルに依存している場合は、メモリ内の同じオブジェクトファイルが存在しますので、複数のコピーがあります

難しい更新するたびにコードのライブラリ関数が変化し、この時間は、する必要があります。リンク再コンパイルが実行可能なプログラムを形成すること。

走行速度:静的にリンクされますが、利点は、実行可能プログラムは、実行時に高速に実行するために必要なすべての手順を実行するために何かを持っていることです。

2 、ダイナミックリンク:

プログラムは、完全なプログラムを形成するために一緒にリンクにそれらで実行されるまで、基本的な考え方は、動的に、個々の部分に独立したスプリットに従ってプログラムモジュールにリンクされている、としてではなく、静的にリンクされたプログラムモジュールは、すべて単一にリンクされています実行ファイル。

共有ライブラリ:各プログラムのニーズは、同じライブラリに依存しているが、ライブラリは、スタティックリンクのようなメモリ内のコピー上の点が、実行され、いくつかのプログラムとして存在していない場合でも、というの共有と同じコピーを

 

+タイトル:ヘッダファイルIFNDEF /何のために/ endifの定義?

[回答]

ファイルヘッダには、重複した参照を防ぐためです。

便利更新:のみ更新する必要がある元のターゲットファイルを置き換え、そしてなくても、再度、再プログラムのすべてのリンクをに。プログラムの下で実行すると、ターゲット・ファイルの新しいバージョンが自動的にメモリにロードされ、目標のアップグレードを完了するためのプログラムをリンクアップされます。

パフォーマンスの損失:プログラムまで延期リンクが実行されているので、ので、各実行手順はする必要がリンクされるので、パフォーマンスの若干の損失があるでしょう。

+トピック:あなたがそれを必要とするとき、どのような事前にコンパイルされ、コンパイル済みの?

[回答]

1.必ずコードの大きな体が頻繁に変更されていない使用しています。

図2は、複数のプログラムモジュールは、すべてのモジュールが同じコンパイルオプションを含むファイルの標準セットを使用します。この場合、すべてのファイルがプリコンパイル済みヘッダーを含むプリコンパイルすることができます。

タイトル:意味合いvolatileキーワード3つの異なる例を与えることは何ですか?。

[回答]

変数揮発性として定義すると、この変数が予期せず変更することができるので、コンパイラはこの変数の値と仮定しなければならないだろうということです。正確にそれ、オプティマイザは慎重でなければならないたびに、代わりにレジスタに格納されたバックアップを使用する、この変数が使用され、この変数の値を再読み込み。ここでは揮発性の変数のいくつかの例は以下のとおりです。

1)ハードウェアデバイスを登録する(例:ステータスレジスタ)

2)非自動変数への割り込みサービスルーチンのアクセスを

(非自動変数)

3)マルチスレッドアプリケーションでの変数が複数のタスクで共有します

トピック:C ++プログラムでCコンパイラをコンパイルされた後、関数を呼び出し、なぜにextern「C」増やす必要がありますか?

[回答]

C ++ 言語のサポート関数のオーバーロードCの言語は関数のオーバーロードをサポートしていません関数は、C ++コンパイラのライブラリにあるC言語の名前と異なっています。

関数プロトタイプを考える:ボイドのfoo(int型のx、int型のy)を、

 

おすすめ

転載: blog.csdn.net/chen1083376511/article/details/92071180