簡単な例として:
struct Month
{
int day;
};
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
Month a;
a.day = 5;
return 0;
}
これを VS2008、VS2010、または VS2012 でコンパイルしようとすると、C2065 (宣言されていない識別子エラー) が発生します。なんで?
簡単な例として:
struct Month
{
int day;
};
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
Month a;
a.day = 5;
return 0;
}
これを VS2008、VS2010、または VS2012 でコンパイルしようとすると、C2065 (宣言されていない識別子エラー) が発生します。なんで?
Microsoft Visual C++ は#include "stdafx.h"
、ソース ファイル内の より前に何もコンパイルしません。その行までのソース内のすべてのコードが既にコンパイルされていることを前提としています。
プリコンパイル済みヘッダーのウィキペディアのページには、これが記載されており、 Microsoft 自身のページで確認されています。
.h
コンパイラは、ファイルの前にあるすべてのコードをプリコンパイル済みとして扱います。#include
ファイルに関連付けられたディレクティブのすぐ先までスキップし、.h
ファイルに含まれるコードを使用して、.pch
ファイル名の後のすべてのコードをコンパイルします。
おそらく内部で起こっていることは、プリコンパイル済みヘッダー ファイル ( ) の作成には、その.pch
時点での状態の保存が含まれるということです。次に、ヘッダーをインクルードすると、その状態がそのままロードされ (現在の状態が上書きされます)、その#include
行の前にソース ファイルでコンパイルされたすべてのものが効果的に破棄されます。