Re: [問題] 新手關於 #include 的問題
看板C_and_CPP (C/C++)作者loveme00835 (朴髮箍)時間15年前 (2011/04/08 19:39)推噓8(8推 0噓 15→)留言23則, 5人參與討論串2/10 (看更多)
※ 引述《kyoiku (所有狗類的主人)》之銘言:
: 「要引入正確的標頭檔才能使用裡面所定義的函式」
宣告
: 例如寫上 #include <math.h> 就可以引用 math.h 裡面所有的函式。
: 可是對於剛接觸 C++ 的人來說,
: 他不太清楚所寫的程式會引用到哪個標頭檔。
math 這個英文字是數學的意思, 表示在 math.h這個標頭檔裡宣告
的是有關數學運算的函式
string.h 則是字串處理的函式宣告s
stdio.h 則是 standard input/output 相關的函式宣告s
所以你想要達成怎樣的功能, 就先聯想到有關的標頭檔, 再去查裡
面是否有你可以呼叫來用的函式, 通常初學也只有以下幾個標頭檔
會比較常用到:
ctype.h
limits.h
math.h
stdio.h
stdlib.h
string.h
time.h
你要先學著大概記住他們的分類依據, 這也是為什麼檔案命名也是
非常重要的原因, 可以作有效的管理.
: 所以我想說能不能把所有標頭檔在開始就都一股作氣全寫上去?
: 不管要寫什麼程式,像這樣:
: #include <math.h>
: #include <iostream.h>
: #include <iostream>
: ...
: ...
: ...
: 就先存起來複製貼上,雖然無腦但也省了找對應標頭檔的時間,
: 可是看了一堆程式碼都沒看到這樣的用法?
: 是高手不屑這樣用還是這樣用會出啥問題呢,@@?
先不考慮編譯的效率是怎樣, 程式碼裡的每一行指令都寓意深遠.
先來看下面的例子, 有 4個檔案分別為 first.h、second.cpp、
third.h、fourth.cpp:
-
// first.h
struct a
{
int x, y;
};
-
// second.cpp
#include "first.h"
// some code here ....
-
// third.h
#include "first.h"
struct b
{
a qq;
int t, u;
};
-
// fourth.cpp
#include "third.h"
// some code here ...
由上面的程式碼我們可以得到一個檔案的相依關係圖:
┌────┐
│ first.h│
└────┘
↗ ↖
┌─────┐ ┌────┐
│second.cpp│ │ third.h│
└─────┘ └────┘
↑
┌─────┐
│fourth.cpp│
└─────┘
箭頭表示的關係是: 相依端 → 被相依端, 在你開始寫自己的標
頭檔後, 這樣的關係必須非常清楚.
在這樣樹狀圖中, 下面的檔案可能會呼叫上方檔案內的函式, 甚
至是使用裡面的資料結構來建立物件, 現在如果 first.h裡的結
構 a要增加一個成員 int z, 因為這樣的相依關係, 所有下游的
second.cpp、fourth.cpp很可能都要重新編譯才能因應改變, 來
做功能的更新; 但去修改結構 b卻只會影響 fourth.cpp 一個檔
案.
一個程式都是由你寫不會有什麼問題, 但是在多人分工的情況下
, 就需要良好的相依結構. 你的問題雖然是引入標準函式庫的標
頭檔(幾乎不再改變), 但還是建議你從初學就養成良好的習慣,
不然如果寫成這樣:
┌────┐ ┌────┐
│ first.h│← │ third.h│
└────┘ └────┘
↑ ↗↖ ↑
┌─────┐ ┌─────┐
│second.cpp│ │ fourth.h │
└─────┘ └─────┘
哪天你不小心呼叫了不相干標頭檔裡的函式而不自知, 對方假如
對他提供的標頭檔常常作改版, 包準你重編譯到哭出來...
-
另外, 附上我自己的一個心得, 在一個檔案最前面引入標頭檔,
也可以對讀者做「心理建設」, 這等於是在跟他說: 「在看這份
程式碼之前, 可能要先對以下這些標頭檔的內容有個簡單的認識
喔!」,通常對引入很多檔案的程式碼, 你讀懂他所要付出的努力
也是相對多的.
--
▂▅▂ ▁ ● ◣ 朴 ☆ 素 ★ 妍 ◢
◢ ◣ ◢▂▂◣ ◢▂※◣ ◢▄▂◣ T.T.L Listen 2
★ ★ ★ ★ ▉ ★ ★▏▉ ★ ★◣ http://ppt.cc/jIUk
◥ˇ◢ ▃◥ˇ◤▃ ◥ˇ◤ ◥ˇ◤◢ 說什麼結束
▃▃▇▃▃ ◢▇◣ ▋▎ ▋¥▎ ◢ http://ppt.cc/zQtB
▼ ▼ ▼ ▼ ψ髮箍 ◤ ◣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
→
04/08 19:53, , 1F
04/08 19:53, 1F
→
04/08 19:53, , 2F
04/08 19:53, 2F
程式碼已補上
→
04/08 19:53, , 3F
04/08 19:53, 3F
利用composite來建構資料型態即有可能會發生
#if !defined(MY_STACK_H)
#define MY_STACK_H
#include <vector>
struct MyStack
{
private: std::vector<int> container;
// ...
};
#endif
推
04/08 20:23, , 4F
04/08 20:23, 4F
→
04/08 20:23, , 5F
04/08 20:23, 5F
→
04/08 20:23, , 6F
04/08 20:23, 6F
推
04/08 20:29, , 7F
04/08 20:29, 7F
推
04/08 20:44, , 8F
04/08 20:44, 8F
→
04/08 20:45, , 9F
04/08 20:45, 9F
→
04/08 20:46, , 10F
04/08 20:46, 10F
→
04/08 20:46, , 11F
04/08 20:46, 11F
推
04/08 20:57, , 12F
04/08 20:57, 12F
→
04/08 20:58, , 13F
04/08 20:58, 13F
推
04/08 21:02, , 14F
04/08 21:02, 14F
補一個箭頭...
推
04/08 21:53, , 15F
04/08 21:53, 15F
→
04/08 21:54, , 16F
04/08 21:54, 16F
→
04/08 21:54, , 17F
04/08 21:54, 17F
個人覺得 forward declaration 不錯, pimpl撰寫上又多了複雜性
, 除非必要我真的會避免用它 Orz...
推
04/08 22:00, , 18F
04/08 22:00, 18F
→
04/08 22:00, , 19F
04/08 22:00, 19F
→
04/08 22:00, , 20F
04/08 22:00, 20F
※ 編輯: loveme00835 來自: 140.121.197.115 (04/08 22:02)
推
04/08 22:12, , 21F
04/08 22:12, 21F
→
04/08 22:13, , 22F
04/08 22:13, 22F
→
04/08 22:13, , 23F
04/08 22:13, 23F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章