編譯與標頭檔

建電大社 [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++

這時候你有三種選擇:

  1. 去看這篇超棒的簡報學習安裝
  2. 去看這部影片
    • 聽聽音樂放鬆一下不要寫code了
  3. 用repl.it提供的terminal 

所以要怎麼編譯東西勒?

先講點基本指令:

  • 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

以剛剛為例

簡單吧?

不過,其實標頭檔與編譯還有許多東西可以講

歡迎來下週專案小社!!!

下課~

  • 大社賽記得來
  • 寒訓記得報名
  • 專案小社記得來聽