1

VS2012には、プリコンパイル済みヘッダーを使用した非常に基本的なプロジェクトがあります。すべての「共通」インクルードをstdafx.hに追加することになっていること、およびこれを各.cppファイルに含める必要があることを知っています。したがって、基本的な設定は次のようになります。

Foo.h:

#ifndef FOO_H
#define FOO_H

class Foo {

public:
    Foo();
    ~Foo();

    void do(string str);
};
#endif

Foo.c:

#include "stdafx.h"
#include "Foo.h"

void Foo::do(string str) {}

stdafx.hで:

#include <string>
using namespace std;

プリコンパイル済みヘッダーがなければ、#include <string>foo.hに入れます。これは、の宣言について知っている必要があるためですstring。しかし、このfoo.hはこのセットアップでどのように知ってstringいますか?(stdafx.hは.cppファイルにのみ含まれていることに注意してください)。

注:プリコンパイル済みヘッダーを使用する実例があります。問題は、これがどのように機能するかについてです。

4

2 に答える 2

2

これは、コンパイラーがヘッダーをメインのコンパイル単位に表示される順序で処理するためです。

.cppファイルは<string>(間接的に)インクルードされているため、"stdafx.h"の内容は<string>コンパイラーに認識され、ヘッダーファイルからプルされたコードであっても、後続のコードで使用できます。

ただし、最初にインクルードせずにヘッダーファイルをインクルード<string>するとエラーが発生するため、脆弱です。

于 2013-03-27T13:47:38.743 に答える
1

プリコンパイル済みヘッダーは、ヘッダーファイルの一種のキャッシュとして見ることができます。コンパイラーは、ヘッダーのセットを最初に検出したとき(通常、stdafx.cppをコンパイルするとき)に分析し、それらをコンパイルして、それらを必要とするモジュールの結果を準備します。

于 2013-03-27T13:54:45.583 に答える