預編譯指令被包含文件的擴展名
.ilk 當選定漸增型編譯連接時,連接器自動生成ILK文件,記錄連接信息
.obj project中每個cpp經編譯成為obj(object)文件,所有obj文件經鏈接(link)成為可執行文件。所以obj可稱為目標文件或中間文件 .pch 預編譯頭文件(一般擴展名為.PCH),是把一個工程中較穩定的代碼預先編譯好放在一個文件(.PCH)里.這些預先編譯好的代碼可以是任何的C/C++代碼--甚至可以是inline函數,只它們在整個工程中是較為穩定的,即在工程開發過程中不會經常被修改的代碼.
.pdb 全稱是 program debug database
它在工程編譯時自動生成, 程序運行時是不需要它的
但是,要debug代碼時,需要載入它,否則不能調試 .exe 是最終編譯生成的可執行文件 如果你程序編譯完畢,可以正常使用,可以只保留.exe文件,因為其它文件都是編譯過程中間生成或用到的,執行時並不需要。
B. c++程序編譯後自動生成的文件有什麼用,分別解釋下
1, PCH文件
預編譯頭文件(一般擴展名為.PCH),是把一個工程中較穩定的代碼預先編譯好放在一個文件(.PCH)里.這些預先編譯好的代碼可以是任何的C/C++代碼--甚至可以是inline函數,只它們在整個工程中是較為穩定的,即在工程開發過程中不會經常被修改的代碼.
為什麼需要預編譯頭文件?一言以蔽之:提高編譯速度.一般地,編譯器以文件為單位編譯,如果修改了一工程中的一個文件則所有文件都要重新編譯,包括頭文件里的所有東西(eg.Macro宏,Preprocessor預處理),而VC程序中,這些頭文件中所包括的東西往往是非常大的,編譯之將占很長的時間.但它們又不常被修改,是較穩定的,為單獨的一個小文件而重新編譯整個工程的所有文件導致編譯效率下降,因此引入了.PCH文件.
如何使用預編譯頭文件以提高編譯速度?要使用預編譯頭文件,必須指定一個頭文件(.H),它包含我們不會經常修改的代碼和其他的頭文件,然後用這個頭文件(.H)來生成一個預編譯頭文件(.PCH)VC默認的頭文件就是StdAfx.h,因為頭文件是不能編譯的,所以我們還需要一個.CPP文件來作橋梁,VC默認的文件為StdAfx.cpp,這個文件里只有一句代碼就是:#include "StdAfx.h".接下來要用它生成.PCH文件,涉及到幾個重要的預編譯指令:/Yu,/Yc,/Yx,/Fp.簡單地說,/Yc是用來生成.PCH文件的編譯開關.在Project->setting->C/C++的Category里的Precompiled Header,然後在左邊的樹形視圖中選擇用來編譯生成.PCH文件的.CPP文件(默認即StdAfx.cpp)你就可以看到/Yc這個開關,它表示這個文件編譯了以後是否生成.PCH文件(可能/Yc的c表示create)./Fp指令指定生成的.PCH文件的名字及路徑(可能/Fp的p代表path)./Yu的u即use使用,工程中只要包括了.H文件的文件都會有這個/Yu指令.如果選擇自動Automatic...的話則原來為/Yc的地方就換成了/Yx指令.如果選擇自動,則每次編譯時編譯器會看以前有沒有生成過.PCH文件,有則不現生成否則就再次編譯產生.PCH文件.
注意:
A,實際上,由Appzard項目向導生成的默認的頭文件及CPP文件StdAfx.h和StdAfx.cpp可以是任何名字的.原因很簡單.但如果你要這樣做就要記得修改相應的Project->setting...下的幾個預編譯指令(/Yc,/Yu,/Yx,/Fp)的參數.
B.在任何一個包括了將要預編譯的頭文件而使用了.PCH文件的工程文件的開頭,一定必須要是在最開頭,你要包含那個指定生成.PCH文件的.H文件(通過.CPP文件包括,默認為StdAfx.cpp),如果沒包括將產生我最開頭產生的錯誤.如果不是在最開頭包括將產生讓你意想不到的莫名其妙錯誤,如若不信,盍為試之?
C.預編譯文件.PCH生成之很耗時間,而且生成之後它也很占磁碟空間,常在5-6M,注意項目完成之後及時清理無用的.PCH文件以節約磁碟空間.
D.如果丟了或刪了.PCH文件而以後要再修改工程文件時,可將指定的/Yc的.CPP文件(默認為StdAfx.cpp)重新編譯一次即可再次生成.PCH文件,不用傻傻的按F7或Rebuild All
2, NCB文件
.ncb 無編譯瀏覽文件(no compile browser)。當自動完成功能出問題時可以刪除此文件。build後會自動生成
3, OBJ文件
目標文件,一般是程序編譯後的二進制文件,再通過鏈接器和資源文件鏈接就成exe文件了。
OBJ只給出了程序的相對地址,而EXE是絕對地址。
4, PDB文件
程序資料庫 (PDB) 文件保存著調試和項目狀態信息,使用這些信息可以對程序的調試配置進行增量鏈接。當以 /ZI 或 /Zi(用於 C/C++)生成時,將創建一個 PDB 文件。
在 Visual C++ 中,/Fd 選項用於命名由編譯器創建的PDB 文件。當使用向導在Visual Studio 中創建項目時,/Fd 選項被設置為創建一個名為 project.PDB 的 PDB。
如果使用生成文件創建 C/C++ 應用程序,並指定 /ZI 或 /Zi 而不指定 /Fd 時,則最終將生成兩個 PDB 文件:
*VC80.PDB (更籠統地說就是 VCx0.PDB,其中 x 表示 Visual C++ 的版本。)該文件存儲各個 OBJ 文件的所有調試信息並與項目生成文件駐留在同一個目錄中。
*project.PDB 該文件存儲 .exe 文件的所有調試信息。對於C/C++,它駐留在 \debug 子目錄中。
每當創建 OBJ 文件時,C/C++ 編譯器都將調試信息合並到 VCx0.PDB 中。插入的信息包括類型信息,但不包括函數定義等符號信息。因此,即使每個源文件都包含公共頭文件(如 <windows.h>),這些頭文件中的 typedef 也只存儲一次,而不是在每個 OBJ 文件中都存在。
鏈接器將創建 project.PDB,它包含項目的 EXE 文件的調試信息。project.PDB文件包含完整的調試信息(包括函數原型),而不僅僅是在 VCx0.PDB 中找到的類型信息。這兩個 PDB 文件都允許增量更新。鏈接器還在其創建的 .exe 或 .dll 文件中嵌入 .pdb 文件的路徑。
Visual Studio 調試器使用 EXE 或 DLL 文件中的PDB 路徑查找 project.PDB 文件。如果調試器在該位置無法找到 PDB 文件或者如果路徑無效(例如,如果項目被移動到了另一台計算機上),調試器將搜索包含 EXE 的路徑,即在「選項」對話框(「調試」文件夾,「符號」節點)中指定的符號路徑。調試器不會載入與所調試的二進制不匹配的 PDB。
5, ILK文件
在增量鏈接時,LINK 更新在第一次增量鏈接期間創建的 .ilk 狀態文件。該文件和 .exe文件或 .dll 文件具有相同的基名稱,並具有擴展名 .ilk。在後面的增量鏈接期間,LINK 更新 .ilk 文件。如果缺少 .ilk 文件,則 LINK 執行完全鏈接並創建新的 .ilk 文件。如果 .ilk 文件無法使用,則 LINK 執行非增量鏈接。有關增量鏈接的詳細信息,請參見漸進式鏈接(/INCREMENTAL) 選項。
6, MAP文件
Windows和linux系統下都有map文件,map文件一般是用來保存符號的地址信息。這里的符號一般是指函數名及變數(局部、全局)。根據這個地址信息,便可以把地址翻譯成相應的符號,很多系統工具、debug方法都要用到這種信息。
(一)一個程序編譯完以後內容會分成兩大類保存,一類是code,一類是data:
(1)code指程序代碼,常存在.text section
(2)data指存程序中聲明的變數,常存在.data section,未初始化的變數會被存在.bss section。
(二)Windows
(1)單個模塊的map文件
在Windows下每一個模塊(dll/exe)對應一個map文件,只需編譯時打開相應的選項即可。
visual studio中方法:右擊工程,選擇Properties,然後選擇 Configuration Properties -Linker - Debugging,將Generate Map File項改成Yes。
編譯後在debug/release目錄里便可以找到與應用程序同名的map文件。
如下為map文件內容:
Timestamp is4b9603e2 (Tue Mar 09 16:16:34 2010) //這個是時間戳,每次編譯都不同,後面符號對應的地址一般也不同。
Preferred loadaddress is 00010000 //這是編譯時的預裝載地址,實際上模塊被載入的地址可能跟這個不同,所以來確定某個地址對應哪個符號信息的時候,還需要知道該模塊載入在內存的真正起始地址,然後根據偏移量來確定。
Start Length Name Class
0001:00000000 001c3950H .text CODE ==》存放程序代碼
0003:000008b8000af67cH .data DATA ==》初始化的變數
0003:000aff40003930b1H .bss DATA ==》未初始化的變數
(2)操作系統總的map文件:不知道有沒有。
(3)mpbin
mpbin是一個反匯編工具,可以輸出exe/dll文件的許多信息。
mpbin /allyourmolename > a.txt 可以把所有的信息保存在一個a.txt中,裡面可以找到時間戳、原debug路徑信息及函數列表等。
如下:
FILE HEADERVALUES
1C2 machine (Thumb)
6 number of sections
49EC0BAE time date stamp Mon Apr 2013:44:14 2009 //時間戳
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
2102 characteristics
Executable
32 bit word machine
DLL
OPTIONAL HEADERVALUES
10B magic # (PE32)
9.00 linker version
53E00 size of code
76A00size of initialized data
0 size of uninitialized data
502ACentry point (100502AC)
1000 base of code
55000 base of data
10000000 image base (10000000 to100CDFFF)
1000 section alignment
200 file alignment
5.01 operating system version
0.00 image version
5.01 subsystem version
0 Win32 version
CE000 size of image
400 size of headers
其中 10000000 image base (10000000 to 100CDFFF)是重要的信息,與map file中的 Preferred load address is10000000 意義相同。
DebugDirectories
Time Type Size RVA Pointer
-------- ------ -------- -------- --------
49EC0BAE cv 81 000020FC CFC Format: RSDS, {A5C699F0-C26D-427E-BC54-3504731BA9B8}, 1,d:\Projects\Final\MyUsbToPc_CPL\MyUsbToPc\Windows Mobile 6 Professional SDK(ARMV4I)\Debug\MyUsbToPc.pdb //原編譯路徑
Begin End Prolog Excpt 32bit Fixup 【Function Name】
0000000010001000 10001040 10001010 N Y Y DllMain
0000000810001040 10001064 10001050 N Y Y ?InitApplet@@YAHPAUHWND__@@@Z (int __cdecl InitApplet(struct HWND__*))
0000001010001064 10001068 10001064 N Y Y ?TermApplet@@YAXXZ (void __cdecl TermApplet(void))
0000001810001068 100013DC 10001078 N Y Y CPlApplet
00000020 1000141C 100014B4 10001420 N Y Y _DllMainCRTStartup
00000028100014B4 100014BC 100014B4 N Y Y GetCurrentProcess
00000030100014BC 100014F0 100014C0 N Y Y
00000038 100014F0 1000155C 100014F4 N Y Y _cinit
00000040 1000155C 10001660 10001560 N Y Y
0000004810001660 10001678 10001664 N Y Y exit
0000005010001678 10001690 1000167C N Y Y _exit
0000005810001690 100016AC10001694 N Y Y _cexit
00000060 100016AC 100016F8 100016B0 N Y Y _c_exit
begin欄對應的地址與map里的地址是一致的,非常類似於map文件。
【注意:很多exe或dll在編譯時時將此信息隱藏的,Function Name會變成空的】
(三)Linux
(1)單個模塊的map文件
暫還不清楚,大家知道的請告知。
(2)操作系統總的map文件
linux系統編譯Image後會生成一個system.map,裡面存了被編譯進內核的符號信息,不同次的編譯生成的system.map會有差異。
因為是操作系統的符號信息,裝載的地址都是固定的,所以不像windows單個模塊那樣靠偏移量定位,直接通過地址就可以直接找到對應的符號。
其內容的重要的幾個符號如下:
_stext//代碼段開始
_etext//代碼段結束
__data_start//初始化的數據開始
_edata//初始化的數據結束
__bss_start//未初始化數據開始
_end//全部結束
Linux相對windows有個很重要的不同是,linux啟動後在proc\kallsyms里也有一份類似Map文件的信息,cat命令可看到其內容,有了這個就可以得到任何一個內核的符號(變數及函數名)的地址信息,而不需要在編譯完內核後特意保存map文件,這真是一個巨大的寶藏。
而且,proc\kallsym的信息比system.map多,在最後會有mole部分的符號信息,這些信息會隨著系統的變化而變化。
(3)nm命令
nm命令用來顯示某個可執行文件的符號信息。符號信息中會包含全局變數(比如下面的xyz)和函數名(比如下面的main),還有一些編譯器插入的符號(比如下面的__data_start,__bss_start)
第二列表示符號的屬性,其中大寫代表global,小寫代表local
Usage: nm[option(s)] [file(s)]
List symbols in[file(s)] (a.out by default).
示例:
nm helo
08049f20 d_DYNAMIC
08049ff4 d_GLOBAL_OFFSET_TABLE_
080484ec R_IO_stdin_used
w _Jv_RegisterClasses
08049f10 d__CTOR_END__
08049f0c d__CTOR_LIST__
08049f18 D__DTOR_END__
08049f14 d__DTOR_LIST__
08048500 r__FRAME_END__
08049f1c d__JCR_END__
08049f1c d__JCR_LIST__
0804a020 A__bss_start
0804a00c D__data_start
080484a0 t __do_global_ctors_aux
08048340 t__do_global_dtors_aux
0804a010 D__dso_handle
w __gmon_start__
0804849a T __i686.get_pc_thunk.bx
08049f0c d__init_array_end
08049f0c d__init_array_start
08048430 T__libc_csu_fini
08048440 T__libc_csu_init
U __libc_start_main@@GLIBC_2.0
0804a020 A _edata
0804a028 A _end
080484cc T _fini
080484e8 R_fp_hw
08048298 T _init
08048310 T_start
0804a020 bcompleted.6635
0804a00c Wdata_start
0804a024 bdtor_idx.6637
080483a0 t frame_mmy
080483c4 T main
U printf@@GLIBC_2.0
0804a014 D x
0804a018 D y
0804a01c D z
helo.c如下:
#include<stdio.h>
int x = 10;
int y = 20;
int z = 30;
extern int__data_start;//這里引用了編譯器插入的符號
int main(void)
{
int *ds = &__data_start;
printf("%p\n", ds);
printf("now x = %d\n", x);
ds+=3;
*ds = 100;
printf("now x = %d\n", x);
}
7, IDB文件
The compiler savesstate information from the first compile in the project』s .IDB file (the default name is project.IDB or VC60.IDBfor files compiled without a project).
The compiler usesthis state information to speed subsequent compiles.
8, SLN文件
Visual Studio.Solution 通過為環境提供對項目、項目項和解決方案項在磁碟上位置的引用,可將它們組織到解決方案中。
C. include<stdi.h>是正確的編譯預處理命令嗎
不是。
程序設計語言的預處理的概念:在編譯之前進行的處理。C語言的預處理主要有三個方面的內容:1.宏定義;2.文件包含;3.條件編譯。預處理命令以符號#開頭。
編譯時以包含處理以後的文件為編譯單位,被包含的文件是源文件的一部分。
編譯以後只得到一個目標文件.obj。
被包含的文件又被稱為標題文件或頭部文件、頭文件,並且常用.h作擴展名。
修改頭文件後所有包含該文件的文件都要重新編譯。
頭文件的內容除了函數原型和宏定義外,還可以有結構體定義,全局變數定義。
D. C語言源程序文件的後綴是什麼,經過編譯後生成文件的後綴是什麼經過連接後生成文件的後綴是什麼
C語言源文件後綴名是.c,編譯生成的文件後綴名是.obj,連接後可執行文件的後綴名是.exe。
源文件的後綴僅僅是為了表明該文件中保存的是某種語言的代碼(例如.c文件中保存的是C語言代碼),這樣程序員更加容易區分,編譯器也更加容易識別,它並不會導致該文件的內部格式發生改變。
(4)預編譯指令被包含文件的擴展名擴展閱讀
C語言是一種結構化語言,它有著清晰的層次,可按照模塊的方式對程序進行編寫,十分有利於程序的調試,且c語言的處理和表現能力都非常的強大。
依靠非常全面的運算符和多樣的數據類型,可以輕易完成各種數據結構的構建,通過指針類型更可對內存直接定址以及對硬體進行直接操作,因此既能夠用於開發系統程序,也可用於開發應用軟體。
C語言是普適性最強的一種計算機程序編輯語言,它不僅可以發揮出高級編程語言的功用,還具有匯編語言的優點。
E. 請問c++中的#include "stdafx.h"是什麼意思
#include "stdafx.h"
是預編譯處理器把stdafx.h文件中的內容載入到程序中來。
stdafx.h
1名稱的英文全稱為:Standard Application Fram Extend
所謂頭文件預編譯,就是把一個工程(Project)中使用的一些MFC標准頭文件(如Windows.H、Afxwin.H)預先編譯,以後該工程編譯時,不再編譯這部分頭文件,僅僅使用預編譯的結果。這樣可以加快編譯速度,節省時間。
預編譯頭文件通過編譯stdafx.cpp生成,以工程名命名,由於預編譯的頭文件的後綴是「pch」,所以編譯結果文件是projectname.pch。
編譯器通過一個頭文件stdafx.h來使用預編譯頭文件。stdafx.h這個頭文件名是可以在project的編譯設置里指定的。編譯器認為,所有在指令#include "stdafx.h"前的代碼都是預編譯的,它跳過#include "stdafx. h"指令,使用projectname.pch編譯這條指令之後的所有代碼。
因此,所有的MFC實現文件第一條語句都是:#include "stdafx.h"。
2 詳細工作原理及作用
stdafx.h中沒有函數庫,只是定義了一些環境參數,使得編譯出來的程序能在32位的操作系統環境下運行。
Windows和MFC的include文件都非常大,即使有一個快速的處理程序,編譯程序也要花費相當長的時間來完成工作。由於每個.CPP文件都包含相同的include文件,為每個.CPP文件都重復處理這些文件就顯得很傻了。
為避免這種浪費,AppWizard和VisualC++編譯程序一起進行工作,如下所示:
◎AppWizard建立了文件stdafx.h,該文件包含了所有當前工程文件需要的MFCinclude文件。且這一文件可以隨被選擇的選項而變化。
◎AppWizard然後就建立stdafx.cpp。這個文件通常都是一樣的。
◎然後AppWizard就建立起工程文件,這樣第一個被編譯的文件就是stdafx.cpp。
◎當VisualC++編譯stdafx.cpp文件時,它將結果保存在一個名為stdafx.pch的文件里。(擴展名pch表示預編譯頭文件。)
◎當VisualC++編譯隨後的每個.cpp文件時,它閱讀並使用它剛生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又編輯了stdafx.cpp或stdafx.h。
這個技術很精巧,你不這么認為嗎?(還要說一句,Microsoft並非是首先採用這種技術的公司,Borland才是。)在這個過程中你必須遵守以下規則:
◎你編寫的任何.cpp文件都必須首先包含stdafx.h。
◎如果你有工程文件里的大多數.cpp文件需要.h文件,順便將它們加在stdafx.h(後部)上,然後預編譯stdafx.cpp。
◎由於.pch文件具有大量的符號信息,它是你的工程文件里最大的文件。
如果你的磁碟空間有限,你就希望能將這個你從沒使用過的工程文件中的.pch文件刪除。執行程序時並不需要它們,且隨著工程文件的重新建立,它們也自動地重新建立。
3 如何理解其原理
通俗一點說
當我們使用AppWizard來自動生成某些項目的時候,系統會自動把所需要include的頭文件在stdafx.h中先include一下,這樣,我們只需要直接include這個stdafx.h文件即可.因為同一個項目中的不同源文件CPP都包含相同的include文件,這樣,為每個.CPP文件都重復include這些文件就顯得很傻了。當然如果你不用MFC的話就不用了。即:在每個.cpp文件中都include stdafx.h 就相當於包含了其他的如iostream.h等文件
4 與stdio.h的區別
我們一般用TC或vc編譯C程序的時候都要首先包含這個stdio.h頭文件,這個頭文件裡麵包含了scanf和printf函數的定義,如果我們不在程序開頭include這個文件,那麼你調用上面這兩個函數就不會成功,它其實和c++中的iostream.h文件的作用差不多的,它們一般都已經在stdafx.h文件中被包含。
F. 67. 文件包含命令中被包含的文件的擴展名( )。 A. 必須是.h
當然是.h文件了 一般頭文件為 #include <stido.h>等等
G. c語言中#include "stdio.h"是什麼
你剛開始學習C語言嗎? 呵呵
沒關系 慢慢來
#表示預處理
#include "stdio.h"
#include "math.h"
main()
{
double x,s;
printf("input number:\n");
scanf("%lf",&x);
s=sin(x);
printf("sine of %lf is %lf\n",x,s);
}
預處理命令還有其它幾種,這里的include 稱為文件包含命令,其意義是把尖括弧""或引號<>內指定的文件包含到本程序來,成為本程序的一部分。被包含的文件通常是由系統提供的,其擴展名為.h。因此也稱為頭文件或首部文件。C語言的頭文件中包括了各個標准庫函數的函數原型。因此,凡是在程序中調用一個庫函數時,都必須包含該函數原型所在的頭文件。在本例中,使用了三個庫函數:輸入函數scanf,正弦函數sin,輸出函數printf。sin函數是數學函數,其頭文件為math.h文件,因此在程序的主函數前用include命令包含了math.h。scanf和printf是標准輸入輸出函數,其頭文件為stdio.h,在主函數前也用include命令包含了stdio.h文件。
H. include stdafx.h 是什麼意思
#include "stdafx.h"
是預編譯處理器把stdafx.h文件中的內容載入到程序中來。
stdafx.h
1名稱的英文全稱為:Standard Application Fram Extend
所謂頭文件預編譯,就是把一個工程(Project)中使用的一些MFC標准頭文件(如Windows.H、Afxwin.H)預先編譯,以後該工程編譯時,不再編譯這部分頭文件,僅僅使用預編譯的結果。這樣可以加快編譯速度,節省時間。
預編譯頭文件通過編譯stdafx.cpp生成,以工程名命名,由於預編譯的頭文件的後綴是「pch」,所以編譯結果文件是projectname.pch。
編譯器通過一個頭文件stdafx.h來使用預編譯頭文件。stdafx.h這個頭文件名是可以在project的編譯設置里指定的。編譯器認為,所有在
指令#include "stdafx.h"前的代碼都是預編譯的,它跳過#include "stdafx.
h"指令,使用projectname.pch編譯這條指令之後的所有代碼。
因此,所有的MFC實現文件第一條語句都是:#include "stdafx.h"。
2 詳細工作原理及作用
stdafx.h中沒有函數庫,只是定義了一些環境參數,使得編譯出來的程序能在32位的操作系統環境下運行。
Windows和MFC的include文件都非常大,即使有一個快速的處理程序,編譯程序也要花費相當長的時間來完成工作。由於每個.CPP文件都包含相同的include文件,為每個.CPP文件都重復處理這些文件就顯得很傻了。
為避免這種浪費,AppWizard和VisualC++編譯程序一起進行工作,如下所示:
◎AppWizard建立了文件stdafx.h,該文件包含了所有當前工程文件需要的MFCinclude文件。且這一文件可以隨被選擇的選項而變化。
◎AppWizard然後就建立stdafx.cpp。這個文件通常都是一樣的。
◎然後AppWizard就建立起工程文件,這樣第一個被編譯的文件就是stdafx.cpp。
◎當VisualC++編譯stdafx.cpp文件時,它將結果保存在一個名為stdafx.pch的文件里。(擴展名pch表示預編譯頭文件。)
◎當VisualC++編譯隨後的每個.cpp文件時,它閱讀並使用它剛生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又編輯了stdafx.cpp或stdafx.h。
這個技術很精巧,你不這么認為嗎?(還要說一句,Microsoft並非是首先採用這種技術的公司,Borland才是。)在這個過程中你必須遵守以下規則:
◎你編寫的任何.cpp文件都必須首先包含stdafx.h。
◎如果你有工程文件里的大多數.cpp文件需要.h文件,順便將它們加在stdafx.h(後部)上,然後預編譯stdafx.cpp。
◎由於.pch文件具有大量的符號信息,它是你的工程文件里最大的文件。
如果你的磁碟空間有限,你就希望能將這個你從沒使用過的工程文件中的.pch文件刪除。執行程序時並不需要它們,且隨著工程文件的重新建立,它們也自動地重新建立。
3 如何理解其原理
通俗一點說
當我們使用AppWizard來自動生成某些項目的時候,系統會自動把所需要include的頭文件在stdafx.h中先include一下,這樣,我
們只需要直接include這個stdafx.h文件即可.因為同一個項目中的不同源文件CPP都包含相同的include文件,這樣,為每個.CPP文
件都重復include這些文件就顯得很傻了。當然如果你不用MFC的話就不用了。即:在每個.cpp文件中都include stdafx.h
就相當於包含了其他的如iostream.h等文件
4 與stdio.h的區別
我們一般用TC或vc編譯C程序的時候都要首先包含這個stdio.h頭文件,這個頭文件裡麵包含了scanf和printf函數的定義,如果我們不在程
序開頭include這個文件,那麼你調用上面這兩個函數就不會成功,它其實和c++中的iostream.h文件的作用差不多的,它們一般都已經在
stdafx.h文件中被包含。
I. c++語言當中的編程:#include「pch.h」。這段話是什麼意思呢
將「pch.h」這個庫函數裡面的函數定義和實現包含到當前的C++源代碼中,使得當前代碼中可以直接調用庫函數「pch.h」中的所有公有函數。
include是一個計算機專業術語,一指C/C++中包含頭文件命令,用於將指定頭文件嵌入源文件中。
include包含指令不僅僅限於.h頭文件,可以包含任何編譯器能識別的C/C++代碼文件,包括.c、.hpp、.cpp、.hxx、.cxx等,甚至.txt、.abc等等都可以。
預處理器發現 #include 指令後,就會尋找指令後面<>中的文件名,並把這個文件的內容包含到當前文件中。被包含文件中的文本將替換源代碼文件中的#include 指令, 就像你把被包含文件中的全部內容鍵入到源文件中的這個位置一樣。
(9)預編譯指令被包含文件的擴展名擴展閱讀:
C++常用 include頭文件:
#include <assert.h> //設定插入點
#include <ctype.h> //字元處理
#include <errno.h> //定義錯誤碼
#include <float.h> //浮點數處理
#include <fstream.h> //文件輸入/輸出
#include <iomanip.h> //參數化輸入/輸出
#include <iostream.h> //數據流輸入/輸出
#include <limits.h> //定義各種數據類型最值常量
#include <locale.h> //定義本地化函數
#include <math.h> //定義數學函數
#include <stdio.h> //定義輸入/輸出函數
#include <stdlib.h> //定義雜項函數及內存分配函數
#include <string.h> //字元串處理
#include <strstrea.h> //基於數組的輸入/輸出
#include <time.h> //定義關於時間的函數
#include <wchar.h> //寬字元處理及輸入/輸出
#include <wctype.h> //寬字元分類
J. 在使用include命令時被包含的文件以()作擴展名 A 必須以 .h B 不能用 .h C 不一定以 .h D 必須以 .c
C是對的#include<stdio.h>#include"init.c"這兩種都是可以的