# 程式的架構 在 [Hello World!](/@jack41402/Hello_World) 這篇中,我們介紹了基礎的C++語法。 ```cpp= #include <iostream> using namespace std; int main() { cout << "Hello World!" << endl ; return 0; } ``` 下面來介紹一下C++這樣寫的理由。 ## 函式庫 ```cpp #include <library> ``` 在 `#include` 後的 `library` 我們稱作函式庫,把 `library` 替換成自己要的函式庫, 像是`iostream`與之後會介紹到的`cmath`和`iomanip`等都是函式庫之一。 跟村民交易也是相同的邏輯。 你要買鑽石裝就要找盔甲匠、要用雞肉換綠寶石就要找到屠夫, 或是想要拿到附魔書就要找圖書管理員。 **也就是要拿到想要的東西,就要找到相對應的事物。** `library` 就像字面上的意思,是圖書館的概念。 我們要學習東西,就要到網路上或是圖書館找到相關的資料, 例如今天我們要學習數學,就要去找數學的資料。 `library` 就是跟程式說你今天要學什麼,程式就會幫你找到那本書。 例如今天你需要輸入與輸出,就用 `#include <iostream>` 跟程式說你要這本書, 程式就會調用這本書讓你使用裡面的內容。 但你如果沒有 `#include <iostream>` 程式就不會讓你使用這本書。 不過調用與使用不是絕對的關係, 你**可以調用後不使用**,但**絕對不能不調用就使用**,這樣會出錯。 :::warning 錯誤訊息會顯示 **error: 'something' was not declared in this scope** 意思是 `something` 在此範圍未被宣告, 這裡的 `something` 可以被替換成其他東西,像是 `cout` 或是 `endl`, IDE 會告訴你是哪一個字詞出錯了。 ::: ## 使用命名空間 ```cpp using namespace std; ``` 現實生活中,在菜市場喊出就有一票人回頭的名字,稱作「菜市場名」。 像是家豪、怡君、Jack 和 John 等,都是常見的名字。 那一個班上同時有2個、甚至3個 Jack 時,該怎麼辦呢? 要區別不同的 Jack,最常使用的就是加個綽號或是編號, 像是 Jack 1號、最弱的Jack,或是玩阿璃的Jack。 另一個例子就是拿鎬子的問題,今天 Jack 跟 Colten 要一把鎬子,而 Jack 心裡想得到的是鑽石鎬。 Colten 給了 Jack 一把木鎬,於是 Jack 就氣得把 Colten 丟到岩漿裡,因為 Jack 要的不是木鎬。 這裡的情況是 Jack 沒有指定他要什麼鎬子,所以給任何一種鎬子都是符合 Jack 的要求的。 Colten 也不會通靈,於是就被丟入岩漿了 QQ。 C++也會遇到菜市場名的問題,同時程式也不會通靈。 例如今天有兩個 `hello()` 函式分別在不同的程式中, 第一個的功能是輸出 `Hello Jack!`,第二個的功能是輸出 `Hello Colten!`。 如果把這兩個程式碼合併,並調用 `hello()` 函式,那程式會輸出什麼呢? 這就是問題所在了,程式會因為判斷不出你想要使用哪一個 `hello()` 函式,因此錯誤。 所以我們用 `namespace` 來指定我們要的函式是哪一個。 像是第一個與第二個 `hello()` 函式,分別在 `tree` 與 `apple` 的 `namespace` 下,透過下面的形式來指定我們要的函式。 ```cpp= tree::hello() ; apple::hello() ; ``` 這個寫法可能看起來很奇怪,不過卻是合理的,因為我們**沒有使用命名空間**。 如果今天我們沒有 `using namespace std;` 我們就要用以下形式去寫程式: ```cpp= #include <iostream> //拿掉using namespace std; int main() { std::cout << "Hello World!" << std::endl ; return 0; } ``` 也就是在 `iostream` 的**成員**前加上 `std::` 如果加上 `using namespace` 就可以將程式碼改寫成: ```cpp= using namespace tree; hello(); //Output:Hello Jack! apple::hello(); //Output:Hello Colten! ``` 要注意,**同一個名字的函式不可以同時使用 `using namespace`**, 因為這樣就回到一樣的問題:**如何區別名稱相同、功能不同的函式?** > 在競技程式以外的情況下,並不鼓勵使用 `using namespace std;` > 這可能在導入外部函式庫時產生衝突,或是在未來C++改版時產生錯誤, > 競程使用的原因是方便、極少用到外部函式庫與`std` 的命名空間涵蓋範圍小, > 甚少影響到程式的撰寫。 ## 主要程式 ```cpp= int main() { cout << "Hello World!" << endl ; return 0; } ``` ### 主程式 ```cpp= int main() { } ``` 第一個詞 `int`,這是整數的意思。 在 `main` 函式中,**只能用整數型別(`int`)返回數值**, 這裡返回的數值是指主要程式中的 `return 0;`,等等會介紹到這個。 :::warning 雖然不是整數型別也可以編譯,但 IDE 會跳出 `warning`。 編譯器會自動改為整數型別,不過仍建議打上 `int main()`。 ::: ### 程式碼 ```cpp= cout << "Hello World!" << endl ; ``` 在主程式中輸入你需要的程式功能,不然程式是不會憑空做事的! ### 回傳值 ```cpp= return 0; ``` 為什麼要回傳值?這是為了**告訴執行程式的上級—父程序(Parent)—程式有正確執行**。 不過 `return 0;` 不是只能回傳 0 ,也可以回傳其他整數數值, 像是 1 或是非零整數 通常代表程式執行錯誤、65 會回傳 A (ASCII碼), 還有其他在不同系統下具有不同含意的數字。 > 若不打上 `return 0;`,會有兩種可能: > > 1. 編譯器會自動補上 `return 0;`。 > 2. 遇到左大括號 `}` 時,回傳 0 。 > > 不過 1. 的情況並不是所有編譯器都有, > 所以要記得打上 `return 0;` 避免錯誤。 ###### tags: `補充`