Re: [問題] 新手請較.cpp、.h跟副程式放置的問題
要先知道「在一個 a.cpp 裡,#include "file"」會做的是什麼事情
事實上,它就只是把 "file" 這個檔案的「所有內容」原封不動的貼到 a.cpp 裡
你的情況很簡單:codeblocks 所做的事情類似
1. 自動幫你編譯專案裡所有的 .cpp 檔變成 object file
g++ main.cpp -o main.o <=== 把 main.cpp 編譯成 main.o,OK
g++ func.cpp -o func.o <=== 把 func.cpp 編譯成 func.o,OK
2. 在編譯後,嘗試把這些 object file 連結成一個可執行檔
g++ main.o func.o main.exe <=== 在這個時候出事,兩個 object 的函式重覆
也就是你的 func.cpp 與 main.cpp 都會被編譯過
但是你的 main.cpp 裡又有 func.cpp 裡的「所有內容」
就像你把 func.cpp 整個複製貼上到 main.cpp 裡
編譯的時候(其實是link的時候)就會發現函式都有兩份的定義了
而 .h 檔並不會被編譯,只是單純的藉由 #include 被貼到 .cpp 檔裡
所以如果你改成 func.h 的話,最後真正被編譯的只有 main.cpp
因此不會有重覆定義的問題
當然你不該這麼寫,因為如果你又寫了另一個 xyz.cpp
include 了 func.h 之後,就會發現重覆定義又來敲門了
一個原則是, .h 檔本來就是被拿來貼上的
哪些東西應該"被貼上",諸如 class、struct、function 的 declare
原因很簡單,沒有這些東西的話,你根本沒辦法使用該 class 或 function
.h 不該有任何 definition,譬如變數的宣告或者函式的實體
所有的 definition 都該寫在 .cpp 檔裡,各別被編譯後,再被 link 起來
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.171.46
※ 編輯: james732 來自: 140.117.171.46 (12/29 12:40)
※ 編輯: james732 來自: 140.117.171.46 (12/29 12:46)
推
12/29 13:00, , 1F
12/29 13:00, 1F
→
12/29 13:01, , 2F
12/29 13:01, 2F
→
12/29 13:03, , 3F
12/29 13:03, 3F
→
12/29 13:04, , 4F
12/29 13:04, 4F
→
12/29 13:04, , 5F
12/29 13:04, 5F
→
12/29 13:04, , 6F
12/29 13:04, 6F
→
12/29 13:06, , 7F
12/29 13:06, 7F
→
12/29 13:06, , 8F
12/29 13:06, 8F
推
12/29 13:11, , 9F
12/29 13:11, 9F
推
12/29 15:26, , 10F
12/29 15:26, 10F
推
12/29 22:23, , 11F
12/29 22:23, 11F
→
12/29 22:24, , 12F
12/29 22:24, 12F
推
12/29 22:26, , 13F
12/29 22:26, 13F
→
12/29 22:26, , 14F
12/29 22:26, 14F
→
12/29 22:27, , 15F
12/29 22:27, 15F
→
12/29 22:27, , 16F
12/29 22:27, 16F
推
12/29 22:31, , 17F
12/29 22:31, 17F
→
12/29 22:31, , 18F
12/29 22:31, 18F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
14
30