c預編譯頭文件
❶ error C1853:預編譯頭文件來自編譯器早期版本,或者預編譯頭為C++而在C中使用(或相反)
方案1:適用於絕大多數文件是 .cpp或絕大多數文件是.c的情況。在這種情況下,將少數的不同類文件設為不使用預編譯頭是比較平衡的做法,方法是:對於 VC++6.0,在FileView 里對要取消預編譯頭的 .c (或 .cpp) 文件點右鍵,選擇 settings,在彈出的對話框右邊選擇category 為 precompiled headers,再設置選項為 not using ...;(對於 VS2005,則在solution explorer 中對相應文件點右鍵選擇 properties,在 precompiled headers 項下設置not using... 即可。如果需要設置多個文件,則可以按住 Ctrl 鍵再同時選中這些文件並設置)PS:解釋如下點擊項目點擊屬性 然後選擇C/C++ 預編譯頭 創建使用頭文件不使用預編譯頭文件(解決方案資源管理器-右擊需要排除的c或cpp文件]-彈出屬性菜單-展開C/C++-預編譯頭-創建/使用預編譯頭-選擇不適用預編譯頭)
方案2:影響的文件比較多,則把它們都設置禁止預編譯頭的話仍然會使項目總體的編譯速度大大降低,得不償失。這時考慮可以為這組文件建立專用的預編譯頭。在VC++ 極早期版本(1.5及以前版本)中是支持單個工程中建立分別針對 .c 和 .cpp的預編譯頭的,但之後的版本中只支持單獨的預編譯頭。在這種情況下,我們可以在workspace(或solution)中建立一個新的靜態鏈接庫 (Static Library) 工程,將所有的 .c文件獨立出來加入到該工程中單獨編譯,這樣就可以在該靜態鏈接庫中針對 .c文件創建預編譯頭。但是這樣做在一定程度上需要被獨立出來的代碼在邏輯上是屬於同一模塊中的,這樣才便於維護。不過從設計的角度來說,這個要求一般是滿足的,否則就應考慮下項目的總體設計了:P最後別忘了設置原項目的依賴項 (dependency) 為獨立出來的這個靜態庫項目。
❷ c/c++中的預編譯問題。
1. 頭文件的預編譯,就是頭文件展開的過程,編譯器掃描c源文件的包含文件,然後進行展開
2. 所以如果1.c 和 2.c 都包含#include 「1.h」 這樣的語句,那麼1.o 和 2.o中就都會包含1.h的信息
❸ C語言含有包含自定義頭文件的程序怎麼編譯
1、只要在程序開頭加入#include 「自定義頭文件名」,在編譯過程當中,頭文件自動會被添加到源文件當中一起進行編譯。
2、編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。C源程序頭文件-->預編譯處理(cpp)-->編譯程序本身-->優化程序-->匯編程序-->鏈接程序-->可執行文件。
❹ fatal error C1010: 在查找預編譯頭時遇到意外的文件結尾...
fatal error C1010: 在查找預編譯頭時遇到意外的文件結尾是因為沒選擇「不使用預編譯頭」。解決步驟如下:
1、首先第一步就是要進行使用預編譯頭文件「stdafx.h」,這時候注意的是加入第三方c/cpp文件沒有#include "stdafx.h",就會報此錯誤。
❺ 預編譯頭文件來自編譯器的早期版本,或者預編譯頭為 C++ 而在 C 中使用它(或相反) 怎麼調試
你是在vs中使用c文件。首先要調用c函數的地方,加上extern "c"{ #include "xx.h"},把c所用的頭文件放這裡面;
然後在vs工程裡面設置不使用預編譯頭
project->configuration property->c/c++->precompiled headers->選not using precompiled heads
❻ 既然預編譯只是起一個聲明的作用,為什麼不在工程中每個c文件中包含所有的頭文件呢這樣不是很方便么
預編譯的時候會把包含的頭文件展開,即把頭文件裡面的內容展開在當前文件中,如果包含所有頭文件,第一會很占空間,因為有些頭文件裡面的變數(比如有很大的數組或者什麼的)在當前這個文件並沒有用到;其次很耗時間,因為要一個個去展開;第三,撇開時間和空間消耗不說,可能會存在不同頭文件中聲明或者定義了同名變數,這樣在編譯的時候就會報錯。但是你卻很難找到錯誤,因為頭文件裡面的東西你看不見,其次還可能引起一個重復包含的問題,比如頭文件A.h包含了B.h,你在當前.c文件中如果#include"A.h" 後又#include"B.h" 的時候就會報錯了,因為你重復包含了,當然重復包含可以通過#ifdef#endif機制解決。但是你不能保證每個頭文件中都做了這樣的操作。
❼ C語言代碼的頭文件與源文件有什麼區別
頭文件和源文件在本質上沒有任何區別。 只不過一般:後綴為 .h 的文件是頭文件,內含函數聲明、宏定義、結構體定義等內容。後綴為 .c 的文件是源文件,內含函數實現,變數定義等內容。而且是什麼後綴也沒有關系,只不過編譯器會默認對某些後綴的文件採取某些動作。這樣分開寫成兩個文件是一個良好的編程風格。
簡單的說其實要理解C文件與頭文件(即.h)有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程:
①預處理階段
②詞法與語法分析階段
③ 編譯階段,首先編譯成純匯編語句,再將之匯編成跟CPU相關的二進制碼,生成各 個目標文件 (.obj文件)
④連接階段,將各個目標文件中的各段代碼進行絕對地址定位,生成跟特定平台相關 的可執行文件,當然,最後還可以用obj生成純二進制碼,也就是去掉了文件格 式信 息。(生成.exe文件)
3.比方說 在aaa.h里定義了一個函數的聲明,然後在aaa.h的同一個目錄下建立aaa.c , aaa.c里定義了這個函數的實現,然後是在main函數所在.c文件里#include這個aaa.h 然後我就可以使用這個函數了。 main在運行時就會找到這個定義了這個函數的aaa.c文件。這是因為:main函數為標准C/C++的程序入口,編譯器會先找到該函數所在的文件。假定編譯程序編譯myproj.c(其中含main())時,發現它include了mylib.h(其中聲明了函數void test()),那麼此時編譯器將按照事先設定的路徑(Include路徑列表及代碼文件所在的路徑)查找與之同名的實現文件(擴展名為.cpp或.c,此例中為mylib.c),如果找到該文件,並在其中找到該函數(此例中為void test())的實現代碼,則繼續編譯;如果在指定目錄找不到實現文件,或者在該文件及後續的各include文件中未找到實現代碼,則返回一個編譯錯誤.其實include的過程完全可以「看成」是一個文件拼接的過程,將聲明和實現分別寫在頭文件及C文件中,或者將二者同時寫在頭文件中,理論上沒有本質的區別。以上是所謂動態方式。對於靜態方式,基本所有的C/C++編譯器都支持一種鏈接方式被稱為Static Link,即所謂靜態鏈接。在這種方式下,我們所要做的,就是寫出包含函數,類等等聲明的頭文件(a.h,b.h,...),以及他們對應的實現文件(a.cpp,b.cpp,...),編譯程序會將其編譯為靜態的庫文件(a.lib,b.lib,...)。在隨後的代碼重用過程中,我們只需要提供相應的頭文件(.h)和相應的庫文件(.lib),就可以使用過去的代碼了。相對動態方式而言,靜態方式的好處是實現代碼的隱蔽性,即C++中提倡的「介面對外,實現代碼不可見」。有利於庫文件的轉發.
❽ 「預編譯頭文件來自編譯器的早期版本,或者預編譯頭為 C++ 而在 C 中使用它(或相反)」
把min.c重命名為min.h
c是源文件
h是頭文件
❾ VC++里的 預編譯頭 是什麼意思,幹嘛用的
一、什麼是預編譯頭?
預編譯頭物理上與通常的的.obj文件是一樣的,但編譯入預編譯頭的.h,.c,.cpp文件在整個編譯過程中,只編譯一次,如預編譯頭所涉及的部分不發生改變的話,在隨後的編譯過程中此部分不重新進行編譯。進而大大提高編譯速度,並便於對頭文件進行管理,也有助於杜絕重復包含問題。
二、什麼時候使用預編譯頭?
當大多.c或.cpp文件都需要相同的頭文件時。
當某些代碼被大量重復使用時。
當導入某些不同庫都有實現的函數,並產生混亂時。