簡単な例として:
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行の前にソース ファイルでコンパイルされたすべてのものが効果的に破棄されます。