先來寫一個最簡單的C++程序
// helloworld.cpp #include <iostream> int main() { std::cout << "Hello, Wrold!" << std::endl; return 0; }
這段代碼反應了4個問題:
下面主要說一下預處理指令:生成一個C++程序有三步。首先,代碼在預處理器中運行,預處理器會識別代碼中的元信息;隨後,代碼被編譯成計算機可以識別的目標文件;最後,每一個目標文件鏈接在一起就變成了一個應用程序。預處理指令以#字符開始,如#include <iostream>,意思就是告訴預處理器:提取<iostream>頭文件中的所有內容供當前文件使用。<iostream>頭文件聲明了C++提供的輸入/輸入功能,只有程序包含了此頭文件,才能完成程序中想要輸出的Hello,World!文本。
注意:熟悉C的同學都知道頭文件是以.h結尾,比如<stdio.h>。在C++中,標准的頭文件省略了.h後綴,如<iostream>,但仍然包含了C中的標准頭文件,只是換了名字,比如原來的<stdio.h>變成了<cstdio>。
預處理指令還有#define、#ifdef、#ifndef、#endif等。例如:
#ifndef MYHEADER_H #define MYHEADER_H // ... #endif
這是為了避免重復包含頭文件的示例。
這裡要提到的是,如果編譯器支持#pragma once指令,則可以使用此指令代替上面的指令:
#pragma once // ...
接下來簡單說一下std::語法:std::endl代表輸出流的結尾,會換行,如同\n字符。::被稱為作用域解析運算符,std指的是命名空間,他們合起來使用是為了解決不同代碼段之間的名稱沖突問題。例如我編寫了一段代碼,其中定義了一個fun()函數,然而在某天,我使用了第三方庫,裡面恰好也定義了一個fun()函數,那麼編譯器則無法判斷代碼中調用的fun()函數到底屬於哪個版本。因此我需要將自己的代碼放到一個命名空間中,首先定義命名空間:
namespace mycode { void fun(); }
當我使用fun()函數的時候,需要指明其命名空間,有兩種方法:
using namespace mycode; int main() { fun(); // 調用的是我自己定義的fun()函數 return 0; } 或者: int main() { mycode::fun(); // 調用的是我自定義的fun()函數 return 0; }
現在就明白,cout輸出流是屬於std命名空間中的,所以寫成std::cout。順便提一下,輸入流cin也是屬於std命名空間中,至於使用方法,在此就不多提了。