0

これは、C ベースの言語を対象とした一般的なコンパイラの質問です。

次のようなコードがあるとします。

#include "header1.h"
#include "header2.h"
#include "header3.h"
#include "header4.h"  //Header where #define BUILD_MODULE is located

#ifdef BUILD_MODULE

//module code to build

#endif //BUILD_MODULE

BUILD_MODULE が定義されていなくても、これらのヘッダーに関連付けられたすべてのコードがビルドされますか? コンパイラはヘッダーの内容を正しく「貼り付ける」だけですか? それで、これは本質的に、スペースを占有するだけの役に立たない束またはヘッダーコードを構築しますか?

4

3 に答える 3

4

ヘッダーのすべてのテキストがコンパイルに含まれますが、以下で説明するように、通常はほとんどまたはまったく効果がありません。

C には「ヘッダー コード」という概念がありません。問題のファイルのコンパイルは、含まれているすべてのファイルの内容が単一のファイルにある場合と同じように扱われます。次に重要なのは、コンテンツがオブジェクトまたは関数を定義しているかどうかです。

ヘッダー ファイル内のほとんどの宣言は (ヘッダー ファイルが一般的に使用されるため) 定義ではなく単なる宣言です。それらはコンパイラに物事を伝えるだけです。オブジェクトやコードが実際に作成されるわけではありません。ほとんどの場合、コンパイラは定義ではない宣言からデータやコードを生成しません。

ヘッダーが外部オブジェクトまたは関数を定義する場合、コンパイラはそれらのデータ (またはスペース) またはコードを生成する必要があります。これらのオブジェクトまたは関数は、後でコンパイルするために他のソース ファイルから参照され、現在のコンパイル。(一部のリンカは、外部オブジェクトまたは関数が使用されていないと判断し、それらを破棄できます。)

ヘッダーが静的オブジェクトまたは関数 (正確には、内部リンケージまたは非リンケージを持つオブジェクト) を定義する場合、コンパイラはこれらのデータまたはコードを生成する場合があります。ただし、オプティマイザーは、これらのオブジェクトと関数が参照されていないことを確認する必要があるため、生成が抑制される場合があります。これは単純な最適化です。複雑なコードやデータ分析を必要とせず、オブジェクトや関数に依存するものがないことを単に観察するだけだからです。

そのため、C 標準は、静的オブジェクトまたは関数に対してデータまたはコードが生成されないことを保証しませんが、最適化が無効にされていない限り、中程度の品質の C 実装であっても回避する必要があります。

于 2013-07-23T20:58:13.210 に答える
1

実際のコンパイラに依存します。最適化コンパイラは不要なコードの出力を生成しませんが、愚かなコンパイラは生成します。

gcc (オープン ソース プラットフォーム用の非常に一般的な C コンパイラ) は、不要な式を生成しない -O オプションを使用してコードを最適化します。

ターゲットが定義されていない #ifdef ステートメント内のコードは、言語仕様に違反するため、出力を生成しません。

于 2013-07-23T20:30:01.970 に答える