P2 C++ 程式設計正規化

扎根deGaoshu發表於2024-05-16

章節 連結
程式碼連結

目錄
    • 2.1.1 C++ 工程的一般組織結構
    • 2.1.2 C++ 工程在機器人中的組織結構
  • 2.2 C++ 程式碼的編譯
    • 2.2.1 g++ 編譯
    • 2.2.2 make 編譯
    • ✅ 2.2.3 CMake 編譯

2.1.1 C++ 工程的一般組織結構

一般情況下,C++工程的組織結構是將不同的功能封裝在不同的類中,每個類用配套的標頭檔案原始檔來實現,標頭檔案可以是*.h*.hpp之類的檔案,原始檔可以是*.cc*.cpp之類的檔案。最後在 main 函式中,呼叫類來實現具體的功能。

2.1.2 C++ 工程在機器人中的組織結構

在機器人專案中,C++ 工程程式碼通常分成兩個部分:一個部分用於實現具體演算法,另一個部分用於進行 ROS 介面封裝
ROS 介面負責資料輸入、資料輸出以及核心演算法呼叫

2.2 C++ 程式碼的編譯

3 種 編譯工具: g++、make、CMake

foo.h

// 宏定義  防止標頭檔案 重複包含與編譯
#ifndef FOO_H_
#define FOO_H_

#include <string>

// 名稱空間設定  防止出現 重複的函式與變數
namespace foo{
    class MyPrint{
        // 宣告類 具體函式實現 在 foo.cpp 中
    public:
        MyPrint(std::string output); // 建構函式
        void ExcutePrint();

        std::string output_;
    };
}
#endif

foo.cpp

#include "foo.h" // 首先在 當前目錄 下搜尋需要包含的檔案
#include <iostream> // 首先在系統標頭檔案目錄中搜尋需要包含的檔案
#include <string>
// 
// 如果是標準庫函式的標頭檔案,則使用<>包含標頭檔案;如果是自定義的標頭檔案,優先使用" "包含標頭檔案。

namespace foo{
    MyPrint::MyPrint(std::string output):output_(output){
        std::cout << "class MyPrint create a object!";
        std::cout << std::endl;
    }
    void MyPrint::ExcutePrint(){
        std::cout << output_ << std::endl;
    }
}

main.cpp

#include "foo.h"

int main(int argc, char** argv){
    // 建立 類 MyPrint 的例項物件, 並傳入 初始化引數
    foo::MyPrint my_print("I can output string!");
    my_print.ExcutePrint(); //  呼叫 物件中的成員函式
    return 0;
}

2.2.1 g++ 編譯

若未安裝 g++:sudo apt install g++
已安裝則跳過。

預處理、編譯、彙編、連線。

g++ foo.cpp main.cpp -o demo
./demo

2.2.2 make 編譯

makefile

start: # 命令塊 命名  下面的命令後不能加註釋。 是直接在 命令列介面 執行的指令
	g++ -o foo.o -c foo.cpp  
	g++ -o main.o -c main.cpp 
	g++ -o demo foo.o main.o 
clean: 	# 刪除 中間檔案 
	rm -rf foo.o main.o

✅ 2.2.3 CMake 編譯

CMake可以自動處理程式之間的關係,併產生對應的 makefile 檔案,然後呼叫 make 就可以編譯了。

CMakeLists.txt

# 宣告 CMake 的最低版本
cmake_minimum_required(VERSION 2.8)

# 宣告 CMake 工程名
project(demo)

include_directories("${PROJECT_BINARY_DIR}")

# 建立庫檔案
add_library (foo foo.cpp)
# 建立 可執行檔案
add_executable (demo main.cpp)
# 為 可執行檔案 連線依賴庫
target_link_libraries (demo foo)

在 原始檔 所在目錄 開啟命令列視窗。

mkdir build
cd build 
cmake ..
make 
./demo

C++ 程式設計風格 可參考:https://github.com/google/styleguide?tab=readme-ov-file

相關文章