fatal error C1010: 在查找預編譯頭時遇到意外的文件結尾


-- fatal error C1010: 在查找預編譯頭時遇到意外的文件結尾。是否忘記了向源中添加“#include "stdafx.h"" --

錯誤很明顯的指向了.cpp中沒加#include "stdafx.h",但有工程屬性-> C/C++ -> 預編譯頭中選擇“不使用預編譯頭”后同樣也會報錯。

查找發現原來是工程中添加的第三方文件導致。這些cpp文件中一直到末尾都沒有找到“stdafx.h”。

解決方式:

設置第三方文件中所有.cpp文件的屬性-> C/C++ -> 預編譯頭,選擇“不使用預編譯頭”。(*.cpp可多選一起設置)

相關的預編譯概念 http://blog.csdn.net/hotandhot/article/details/1346195

 

一、概念:

1、預編譯:就是編譯器首先編譯某個文件(稱為預編譯頭文件),然后將這個編譯結果保存起來,之后如果有其他源文件include了這個“預編譯頭文件”的時候,則自動從這個編譯結果提取需要的信息進行編譯。

2、預編譯結果文件(Precompiled header file):就是那個用來保存已經編譯了的符號信息的文件(.PCH作為后綴)

3、生成預編譯結果文件(Create Precompiled header file):我們說源文件A通過文件B“生成預編譯結果文件”是指編譯A的時候將其中編譯B的編譯結果保存成預編譯結果文件。一般使用向導的話,A文件就是“stdafx.cpp”,B文件是“stdafx.h”。stdafx.cpp中就一行語句:

#include “stdafx.h”

4、使用預編譯頭(Using precompiled header):我們說某個源文件(a.cpp)通過“stdafx.h”來使用預編譯結果是指編譯a.cpp的時候,如果a.cpp第一行include語句是#include “stdafx.h”的話,那么直接取預編譯結果文件的結果,不再重新編譯”stdafx.h”

二、向導是怎么做的?

1、設置“stdafx.cpp”的預編譯選項是通過“stdafx.h”文件來“生成預編譯結果文件”。

2、其他源文件的預編譯選項設置是通過“stdafx.h”來“使用預編譯頭”

三、使用原則?

1、將相對穩定的頭文件(比如CRT,STL,第三方固定的庫)全部寫在stdafx.h中。(是否使用stdafx.h依賴個人喜好,不過使用stdafx.h可以和向導保持一致)

2、全部源文件第一行都加#include “stdafx.h”。

3、一些不能修改的源文件(如果公共的代碼,不具備權限修改的代碼),設置他的預編譯選項是“不使用預編譯頭”。注意,一定不能是選擇“自動生成預編譯頭”,因為這樣會將stdafx.h的結果沖掉(這個不知道是BUG還是設計的問題了,.^_^。)。

四、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就什么內容都不寫!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM