在查找預編譯頭時遇到意外的文件結尾。是否忘記了向源中添加「#include "StdAfx.h"」?linux
右鍵選擇該文件.cpp格式的->屬性->預編譯頭,→ 不使用預編譯頭c++
錯誤描述:fatal error C1010: 在查找預編譯頭時遇到意外的文件結尾。是否忘記了向源中添加「#include "stdafx.h"」?spa
錯誤分析:.net
此錯誤發生的緣由是編譯器在尋找預編譯指示頭文件(默認#include "stdafx.h")時,文件未預期結束。沒有找到預編譯指示信息的頭文件"stdafx.h"。設計
(由於工程中的每一個cpp文件屬性默認都是使用預編譯頭(/YU)的,可是添加的第三方文件並無 #include "stdafx.h" 預編譯指示頭,因此編譯器在此cpp文件中一直到末尾都沒有找到它)blog
個人這個問題發生於我經過添加文件的方式,向MFC內添加現有的一大坨.h和.cpp文件。這些.h和.cpp文件是屬於標準C++的開源源代碼範疇,與MFC無更深層次的關係。資源
解決方式:get
一.編譯器
1) 在解決方案資源管理器中,右擊相應的.cpp文件,點擊「屬性」編譯
2) 在左側配置屬性中,點開「C/C++」,單擊「預編譯頭」
3) 更改右側第一行的「建立/使用預編譯頭」,把選項從「使用預編譯頭(/Yu)」改爲「不使用預編譯頭」
4) 注:每個報錯的.cpp都要如此更改哦~辛苦一下唄~
二.
(不推薦)
1)在解決方案右擊工程,點擊屬性
2)在配置屬性 -> c/c++ -> 預編譯頭 中 將 「使用預編譯頭(/YU)」 改成 「不適用預編譯頭」
這種作法會使每次編譯過程很是緩慢
備註:
1) 貌似也能夠直接在.cpp頭文件上include stdafx.h。但沒嘗試如此修改,由於不想破壞源代碼的標準性^_^
2) 感慨一下VC在識別、編譯這方面的遲滯-_-,或許是由於太強大了吧,就沒考慮周全,居然還須要手動修改~
3) 有點懷念Qt了……
補充的資料:
出處:http://blog.csdn.net/hotandhot/archive/2006/10/23/1346195.aspx
1、概念:
一、預編譯:就是編譯器首先編譯某個文件(稱爲預編譯頭文件),而後將這個編譯結果保存起來,以後若是有其餘源文件include了這個「預編譯頭文件」的時候,則自動從這個編譯結果提取須要的信息進行編譯。
二、預編譯結果文件(Precompiled header file):就是那個用來保存已經編譯了的符號信息的文件(.PCH做爲後綴)
三、生成預編譯結果文件(Create Precompiled header file):咱們說源文件A經過文件B「生成預編譯結果文件」是指編譯A的時候將其中編譯B的編譯結果保存成預編譯結果文件。通常使用嚮導的話,A文件就是「stdafx.cpp」,B文件是「stdafx.h」。stdafx.cpp中就一行語句:
#include 「stdafx.h」
四、使用預編譯頭(Using precompiled header):咱們說某個源文件(a.cpp)經過「stdafx.h」來使用預編譯結果是指編譯a.cpp的時候,若是a.cpp第一行include語句是#include 「stdafx.h」的話,那麼直接取預編譯結果文件的結果,再也不從新編譯」stdafx.h」
2、嚮導是怎麼作的?
一、設置「stdafx.cpp」的預編譯選項是經過「stdafx.h」文件來「生成預編譯結果文件」。
二、其餘源文件的預編譯選項設置是經過「stdafx.h」來「使用預編譯頭」
3、使用原則?
一、將相對穩定的頭文件(好比CRT,STL,第三方固定的庫)所有寫在stdafx.h中。(是否使用stdafx.h依賴我的喜愛,不過使用stdafx.h能夠和嚮導保持一致)
二、所有源文件第一行都加#include 「stdafx.h」。
三、一些不能修改的源文件(若是公共的代碼,不具有權限修改的代碼),設置他的預編譯選項是「不使用預編譯頭」。注意,必定不能是選擇「自動生成預編譯頭」,由於這樣會將stdafx.h的結果沖掉(這個不知道是BUG仍是設計的問題了,.^_^。)。
4、Q&A
Q、爲何不所有使用「自動生成預編譯頭文件」?
A、「自動生成預編譯頭文件」和什麼都不用沒有什麼兩樣,編譯速度沒有質的提升。
Q、手工添加一個新的源文件到項目的時候,常常出現相似錯誤:
fatal error C1010: unexpected end of file while looking for precompiled header directive
A、由於嚮導缺省的設置是「使用預編譯頭」,可是你新加的文件並無在第一行包含「stdafx.h」。解決的方法要麼修改爲「不使用預編譯頭」,要麼添加一行#include 「stdafx.h」
Q、加stdafx.h和stdafx.cpp總以爲是和編譯平臺綁定了,不具有移植性?
A、其實,注意一下stdafx.h的寫法就沒有問題了。個人解決方案是(stdafx.h的內容):
–begin of file stdafx.h
#ifdef _WIN32
#include 「win.h」 // 泛指window下的公共頭文件
#else
#include 「linux.h」 // 泛指linux下的公共頭文件
#endif
#include 「crt.h」 //泛指c標準庫
#include 「stl.h」 //泛指STL庫
–end of file
或者更加簡單一點,若是不是VC編譯器,那麼stdafx.h就什麼內容都不寫!