2009-07-09 19 views
178

マイヤーズ の "Effective C++"の執筆時点で、翻訳単位という用語が使われています。 C++での "翻訳単位"とは

は、誰かが私に説明を与えてもらえ:正確には何

1)

2)それが唯一の関連している場合)C++

3でプログラミングするとき、私はそれを使用することを検討すべきである場合にはC++への、またはそれは

他のプログラミング言語で使用することができ、私はすでに用語を知らなくても、それを使用する場合があります....

答えて

206

:(wayback machine link

standard C++wayback machine link)によれば: 変換ユニットは、C++でのコンパイルの基本単位 あります。それは、直接または間接的に含ま 単一のソースファイル、 の内容に加えて、任意のヘッダファイル の内容で構成され、条件前 ステートメントを使用して無視された マイナスこれらの行。

は、オブジェクトファイル、ライブラリ、 または実行可能プログラムにコンパイルできます。

翻訳単位の概念は、1定義ルールの および テンプレートの文脈で最も頻繁に言及されている です。

52

A TR anslation unitはすべての目的と目的のために、の後にすべてのヘッダーファイルを含むファイル(.c/.cpp)です。

http://msdn.microsoft.com/en-us/library/bxss3ska%28VS.80%29.aspx

+3

ヘッダーファイルを含みます。ヘッダーファイルは、コードが生成されない場合でも、コンパイラによって処理されます。 JeffHのプリプロセッサのコメントも参照してください。 "コンパイラが見ているすべてのもの"という定義は良いものです。 –

+9

".h"で終わるファイルをコンパイルすることはできます。ファイル名はまったく重要ではありません。内容はです。 "foo.h"の内容が "int main(){}"の場合、それをコンパイルすることができます。 –

+0

@LightnessRacesinOrbit:ええ、私が言っていることは、ヘッダをTUとしてコンパイルするのではなく、間接的にTUにコンパイルするのではなく、直接コンパイルすることです。間違っているという最初のコメントを削除し、新しいものにコンテキストを与えるために2番目のコメントを残しました。 – GManNickG

7

本は十分にそれが明確になります。 Meyersが「翻訳単位」を参照するとき、彼はソースコードファイルを意味します。 hereから

+1

いいえ。もし彼がソースコードについて話していたら、彼はソースファイルを言うでしょう。翻訳単位は、ソースコードをコンパイルして作成されます。明確な違いに注意してください。それは "翻訳された"ソースコードです。 – Dan

+1

@ダン:いいえ、そうではありません。翻訳単位は、コンパイルする前のソースファイル、つまりコンパイル前のプリプロセッサの出力です。 –

+0

ちょうどコンパイルプロセスの一部であるプリプロセッサ。あなたのくちばしを微調整するつもりはありませんでしたが、 "翻訳単位"について話をすると、前処理されたものとそうでないものとの間に明確な違いがあります。彼らは交換可能な名詞ではありません。それが私の主張です。 – Dan

3

翻訳単位は、適切なコンパイラに渡されるコードです。これは、通常、出力が.cファイルでプリプロセッサを実行していることを意味します。

0

すべてのcpp/c(実装)ファイルは、変換単位(つまり、オブジェクトファイル(.obj))に変換され、cppファイルのヘッダーはヘッダーファイルの実際のテキストに置き換えられます。

23

確かに答えにくい質問です。

プログラムのテキストは、この国際標準ではソースファイルと呼ばれる単位で保存されています。 プリプロセッサディレクティブの#include介し含まれるすべてのヘッダ(17.4.1.2)とソースファイルとソースファイル (16.2)、以下の任意のソース線direc- tivesを前処理 条件含める(16.1) のいずれかによってスキップ翻訳単位と呼ばれます。[注:C++ プログラムはすべて同じ時刻に に翻訳される必要はありません。 ]

したがって、翻訳単位は、プリプロセッサの#includeメカニズムを使用して、単一のC++ソースファイルとそれに含まれるヘッダーまたはその他のファイルです。

あなたの他の質問について:私はC++

でプログラミングするときは、それを考慮していないことはできません それを使用することを検討すべきである場合には

2) - 翻訳単位はCの基本です++プログラム。

3)それが唯一のC++に関連している場合、またはそれ は、他のプログラミングで使用することができます 言語

他の言語には、同様の概念を持っていますが、その意味は微妙に異なるものになります。他の言語のほとんどはプリプロセッサを使用しません。

+0

それが明確かどうかわかりません。これはやや暗い領域かもしれません。たとえば、あらかじめコンパイルされたヘッダーが許可されていることから引用した標準パラからは明らかではありません。 –

+0

@GMan、それはあなたが1つの定義ルールに非常に注意する必要があるところです。クラスが異なるコードを持つようになる前に、わずかに異なる定義を持つ異なる翻訳単位でクラスをインクルードすると、定義されていない問題が発生します。 –

+5

@GManは、標準で使用される2つの用語「ヘッダ」と「ソースファイル」に注意してください。 "ヘッダ"は標準ライブラリにのみ使用されます。一部のコードに含まれているユーザーファイルは、標準では「ヘッダー」ではなく、「ソースファイル」と呼ばれます。スタンダードは、C++プログラマが貧弱な ".h"と ".cpp"の違いを知りません: –

0

翻訳単位は、基本的に、前処理後のソースファイルの内容です。これは、言語文法の最上位のプロダクションです。 CまたはC++コンパイラを作成している場合は、それについて心配する必要があります。

+0

"CまたはC++コンパイラを書く場合には心配する必要があります。" 私は意見が分かりません:プログラマは、しばしばコンパイラが何をしているのかを理解する必要があります。したがって、たとえば、異なる翻訳単位で定義された非ローカル静的オブジェクトの初期化の相対的な順序は定義されていません "Effective C++のItem#5の重要な点を理解するために、翻訳単位が何であるかを知る必要があります。 –

1

MSDNに従って:CおよびC++プログラムは、1つまたは複数のソースファイルで構成され、それぞれにはプログラムのテキストの一部が含まれています。ソースファイルとそのインクルードファイル(#includeプリプロセッサディレクティブを使用してインクルードされているファイル)は、#ifなどの条件付きコンパイルディレクティブによって削除されたコードのセクションは含まれていませんが、「トランスレーションユニット」と呼ばれます。

4

ODRに加えて、翻訳単位は、名前のない名前空間の定義において重要です。これは、以前の「静的」用途の1つに置き換わります。

私はまだトップの答えの下にコメントを追加するには十分なポイントがないと思います。

2

CおよびC++プログラムは、1つまたは複数のソースファイルで構成され、それぞれにはプログラムのテキストの一部が含まれています。ソースファイルとそのインクルードファイル(#includeプリプロセッサディレクティブを使用してインクルードされているファイル)は、#ifなどの条件付きコンパイルディレクティブによって削除されたコードのセクションを含まず、「トランスレーションユニット」と呼ばれます。

関連する問題