編譯與標頭檔
建電大社 [11]
by 鹽亞倫
原本今天要講STL的
不過看上週大家上課情形
今天就來講點不一樣的吧
大社賽
先來講講下週的注意事項
大社賽注意事項
- 比賽時間:12/16(五)13:05 ~ 13:50
- 請在13:00以前進入教室
- 規則:
- 可以看簡報
- 可以查資料
- 不行討論
- 可以問學長問題,
但可能不會有人回答你
- 只是娛樂性質的比賽啦~大家開心寫就好
- 前幾名會有獎品
大社賽注意事項 -2
- 比賽會使用codeforces平台進行
- 請先確認你已經加入建北電資的CF group
- 以此表單(等我做完放連結)進行登記
請點選大社賽測機進行練習吧
submit按這裡
標頭檔
進入正題了
其實還沒
今天要用repl.it作為教學
請各位先上去建立一個新的專案
先來寫一個簡單的有struct和function的程式
#include <iostream>
using namespace std;
struct person{
double height;
double weight;
double BMI() {
return weight / (height * height);
}
person(double _h, double _w) : height(_h), weight(_w) { }
};
void printBMI(person& a) {
cout << a.BMI() << endl;
}
int main() {
person aaw(1.75, 60.0);
printBMI(aaw);
}
來對上面程式做一點修改好了
應該有人知道
函數有個東西叫做提前宣告吧
#include <iostream>
using namespace std;
struct person{
double height;
double weight;
double BMI() {
return weight / (height * height);
}
person(double _h, double _w) : height(_h), weight(_w) { }
};
void printBMI(person& a); // 先宣告
int main() {
person aaw(1.75, 60.0);
printBMI(aaw);
}
void printBMI(person& a){ // 再實作
cout << a.BMI() << endl;
}
在C++裡面,如果沒有先行宣告,main函數看不到在他後面的程式碼
繼續來對上面程式做一點修改好了
應該有人知道
struct內的函式也可以先宣告事後實作吧
#include <iostream>
using namespace std;
struct person{
double height;
double weight;
double BMI(); // 先宣告
person(double _h, double _w); // 先宣告建構式
};
void printBMI(person& a); // 先宣告
int main() {
person aaw(1.75, 60.0);
printBMI(aaw);
}
// 再實作
double person::bmi(){
return weight / (height * height);
}
// 實作建構式
person::person(double _h, double _w) : height(_h), weight(_w) { }
void printBMI(person& a){ // 再實作
cout << a.BMI() << endl;
}
不過有沒有想過為什麼C++要有這種設計呢?
腦洞大開ing
假設我今天莫名其妙
想要有很多個 .cpp 檔案
該怎麼辦?
我有沒有辦法讓他們共用全域變數 & function & struct & class ???
似乎只要先宣告過就可以!!!
來試試看把printBMI的實作移到另一個cpp檔案中
在main.cpp裡面保留printBMI的宣告
在printBMI.cpp裡面保留person的宣告
啊不過假設我希望再把person裡面的函數獨立在一個person.cpp裡面
這樣person.cpp不就還要再複製一次
struct person的宣告嗎
複製那麼多次好麻煩喔
可不可以寫在一個地方再叫所有人去看他就好?
話說
有沒有人想過
#include <iostream>
#include <string>
#include <vector>
這些東西是什麼?
標頭檔!
標頭檔
- 副檔名 .h
- 一個把所有提前宣告的東西一起寫完的地方
- 用 #include 的方式把它 include 進來
- 例如:
#include <iostream>
#include "person.h"
-
其中,用<>的話代表是系統標頭檔
-
例如電腦
的/usr/bin/include中會有一個iostream.h
-
-
用 "" 的則是你自己寫的標頭檔
,要放在同一個目錄底下
來寫一個person.h吧
#include <iostream>
using namespace std;
struct person{ // 留著person的宣告
double height;
double weight;
double BMI(); // 先宣告
person(double _h, double _w); // 先宣告建構式
};
void printBMI(person& a); // 留著printBMI的宣告
其他檔案只要#include"person.h"就好
編譯
話說
你會發現
今天之所以要用repl
是因為 會自動幫你編譯執行
如果沒有repl或是codeblocks這些東西的話
要怎麼編譯檔案勒?
要用終端機指令啦哈哈
啊不過有些人的電腦
例如電教的
並沒有安裝 g++
所以要怎麼編譯東西勒?
先講點基本指令:
- ls:列出當前資料夾有的東西
- cd:切換資料夾
- pwd:現在在哪個資料夾
好喔
來講 g++ 了
要怎麼用g++來編譯勒?
g++ -std=c++14 -o OUTPUT_NAME.exe CPP_NAME.cpp
g++ CPP_NAME.cpp
簡單版:將CPP_NAME.cpp編譯成執行檔
執行檔檔名會是 a.out 或是 a.exe
./a.out
再用上面這個指令來執行
進階版:多指定一點東西
c++版本
執行檔檔名
啊如果有多個檔案勒?
串聯他們
g++ -o hahaha.exe main.cpp person.cpp printBMI.cpp
以剛剛為例
簡單吧?
不過,其實標頭檔與編譯還有許多東西可以講
歡迎來下週專案小社!!!
下課~
- 大社賽記得來
- 寒訓記得報名
- 專案小社記得來聽
建電大社[11] 編譯與標頭檔
By Aaron Wu
建電大社[11] 編譯與標頭檔
- 164