今天在做VC++實驗時,總是出現莫名其妙的錯誤。比如說:
unexpected end of file whilelooking for precompiled header directive
???再比如說這么一大串:
mainframe.cpp 有錯誤\firstdlg.h(21) :error C2065: 'IDD_DIALOG_FIRST' : undeclared identifier
mainframe.cpp 有錯誤\firstdlg.h(21) : error C2057: expected constantexpression
mainframe.cpp 有錯誤\seconddlg.h(21) : error C2065:'IDD_DIALOG_SECOND' : undeclared identifier
mainframe.cpp 有錯誤\seconddlg.h(21) : error C2057: expected constantexpression
MainFrame.cpp 有錯誤\MainFrm.cpp(25) : error C2065: 'ID_TEST_DLG' :undeclared identifier
MainFrame.cpp 有錯誤\MainFrm.cpp(26) : error C2065: 'ID_TEST_DLG1' :undeclared identifier
MainFrame.cpp 有錯誤\MainFrm.cpp(58) : error C2065: 'IDR_MAINFRAME' :undeclared identifier
??研究了好久,終于發現了錯誤原因,原來全都是#include "stdafx.h" 搞的鬼。
?? #include"stdafx.h" 必須是所有的CPP實現文件第一條語句,由系統自動生成。
?? stdafx.h(Standard Application Framework Extensions ): 標準系統包含文件的包含文件。
?? Microsoft C 和 C++編譯器提供了用于預編譯任何 C 或 C++代碼(包括內聯代碼)的選項。利用此性能特性,可以編譯穩定的代碼體,將已編譯狀態的代碼存儲在文件中,以及在隨后的編譯中,將預編譯的代碼與仍在開發的代碼結合起來。由于不需要重新編譯穩定代碼,因此后面每次編譯的速度都要快一些。
??預編譯代碼有助于在開發周期中縮短編譯時間,特別是在以下情況中:
?? 一:總是使用不經常改動的大型代碼體。
??二:程序由多個模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預編譯為一個預編譯頭。
?? 三:用于創建預編譯頭文件的第一次編譯所花費的時間比后面的編譯稍長一些。通過包含預編譯代碼可以加快后面的編譯速度。C 和 C++程序都可以預編譯。在 C++編程中,常見的做法是將類接口信息分別放到不同的頭文件中。此后就可以將這些頭文件包含在使用該類的程序中。通過預編譯這些頭文件,可以縮短程序的編譯時間。
??VC創建項目時自動創建的預編譯頭文件,在編譯其他文件之前,VC先預編譯此文件。頭文件stdafx.h引入了項目中需要的一些通用的頭文件,比如window.h等,在自己的頭文件中包括stdafx.h就包含了那些通用的頭文件。
??所謂頭文件預編譯,就是把一個工程(Project)中使用的一些MFC標準頭文件(如Windows.H、Afxwin.H)預先編譯,以后該工程編譯時,不再編譯這部分頭文件,僅僅使用預編譯的結果。這樣可以加快編譯速度,節省時間。
??預編譯頭文件通過編譯stdafx.cpp生成,以工程名命名,由于預編譯的頭文件的后綴是“pch”,所以編譯結果文件是projectname.pch。
??編譯器通過一個頭文件stdafx.h來使用預編譯頭文件。stdafx.h這個頭文件名是可以在project的編譯設置里指定的。編譯器認為,所有在指令#include"stdafx.h"前的代碼都是預編譯的,它跳過#include "stdafx.h"指令,使用projectname.pch編譯這條指令之后的所有代碼。
?? 因此,所有的CPP實現文件第一條語句都是:#include"stdafx.h"。
?? #include"stdafx.h"如果不小心刪了,就會有第一種錯誤;
?? #include"stdafx.h" 如果沒有在第一句,就會出現第二種錯誤。