再探C++Primer (1) 關於編譯及IO流

以前在看primer的時候,第一章的內容通常都會跳過去,今天打算從頭再看一次的時候,反而注意到了第一章的東西,很簡單的東西,也學到了一些以前沒有關注的內容。linux

##編譯、運行程序# 在以前都是使用現成的IDE來編譯運行程序,可是並無想過究竟編譯是個怎麼樣的過程。在學習linux的過程當中,曾經瞭解過一些編譯的過程:編譯會將cpp文件內容先預處理,而後用編譯器翻譯成彙編語言文件,再經彙編器翻譯成.o文件,不一樣的.o文件經由連接器鏈接到一塊兒成爲機器能夠識別的.out文件(windows中的.exe)。ios

那麼在windows中cpp文件是怎麼由vs2015之類的IDE來編譯連接的呢?c++

在linux中,編譯器是gnu,使用gnu編譯一個cpp程序的步奏是使用命令g++,而在windows中編譯器是vc/vc++,在vs中集成了vc/vc++編譯器,因此咱們可使用vs來編譯c++程序文件。windows

隨便百度一下,就能夠知道windows控制檯編譯c++程序文件的命令是cl, 格式爲CL [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...],關於具體的命令去查閱文檔就能夠了,如今只須要知道在cmd控制檯,當前目錄下的a.cpp文件編譯命令是cl a.cpp就能夠了。學習

可是當我使用了這個命令後,系統提示我沒找到這個命令,是由於cl.exe文件存放在vc的bin目錄下,沒有把vc的bin目錄放入系統環境變量,系統天然找不到cl在哪裏。翻譯

因此咱們須要作的事情,第一個是下載安裝vc(固然也能夠下載vs並安裝vc,vc文件夾在vs的安裝目錄下能夠找到),在vc的目錄下,有個bin文件夾,將vc的bin目錄放入環境變量path便可。日誌

如今咱們寫一個helloworld來用控制檯運行cpp文件觀察效果如何。code

#include <iostream>
int main()
{
	std::cout<<"Hello World!"<<std::endl;
	return 0;
}

例如個人helloworld.cpp存放在e盤c++目錄下,那麼輸入如下命令來編譯該程序:對象

cd /d e:\c++
cl helloworld.cpp

而後系統提示咱們iostream文件沒有找到,這是由於iostram庫存放在vc的include目錄下,而咱們並無將它放在咱們的當前目錄下,也沒有將它置入環境變量,系統天然無從找起。ci

因此有兩個解決方法,第一個是把iostream拷貝到當前目錄,固然這仍是錯的,由於iostream中包含了istream,istream又包含了ostream,等等,這樣下去咱們就要把include整個拷貝過來了,這樣顯然是不合適的。

第二個辦法是在環境變量中添加include文件夾,使得系統在編譯過程當中在本身的環境變量中找到iostream庫。咱們本身配置起來是一件很麻煩的事情,可是這個過程仍是要知道的。

很慶幸的是vc其實已經幫咱們作好了這些配置的工做,就在vc目錄下的vcvarsall.bat,一個批處理文件將咱們經常使用的環境變量和工做目錄所有都配置好了,因此咱們只要在編譯前運行它就行了,例如個人vs在d盤根目錄,則:

d:\vs2015\vc\vcvarsall.bat
cd /d e:\c++
cl helloworld.cpp

若是上面的過程沒有問題的話,那麼如今你的程序大概已經編譯成功了,在cpp所在的目錄下會出現一個.obj和.exe文件,一個是編譯的過程文件,一個是可執行程序。直接用

helloworld

命令便可執行,會在屏幕上輸出Hello World!。

##IO流#

c++沒有定義任何輸入輸出語句,相反提供了一個全面的標準庫來提供io機制。

iostream庫包含兩個基礎類型istreamostream,表示輸入流和輸出流,流的意思是字符序列,表示順序生成或順序消耗。

標準庫提供了4個IO對象,分別是cincoutcerrclog,分別進行標準輸入,標準輸出,標準錯誤輸出,標準日誌信息。

<<」流輸出符號,「>>」流輸入符號,能夠進行重定義。

endl是操控符,曾經覺得它僅僅表示換行,其實它還有更重要的做用,就是將緩衝區數據寫入輸出對象中,沒有endl,輸出的數據僅僅儲存在緩衝區中,發生意外容易丟失或損壞,而輸入到io對象後,纔可以真正輸出出來。

相關文章
相關標籤/搜索