vscode執行C++20,支援模組的實現。

FischerWu發表於2024-06-10

C++是一個古老的語言,為了跟上時代,一直進行緩慢的演化。在2011年,C++11的釋出讓這個語言進入21世紀,可以現代化的使用。它有著lambda表示式,auto型別推斷。此外使用容器替代低階語言結構,智慧指標或其他RAII技術加強了安全程式設計。我們在編寫C++程式碼應多使用現代化的函式。C++20讓程式設計更加現代化,優雅簡潔。一個 Module 是一個獨立的翻譯單元,包含一個到多個 module interface file(即模組介面檔案),包含 0 個到多個 module implementation file(即模組實現檔案),使用 Import 關鍵字即可匯入一個模組。是下面是程式碼示例,來自《C++20實踐入門》,編譯環境是Mac。

// A complete C++ program
import <iostream>;
// # include <iostream>

int main()
{
int answer {42}; // Defines answer with value 42

std::cout << "The answer to life, the universe, and everything is "
		<< answer
		<< std::endl;

return 0;
}

CMake配置:

cmake_minimum_required(VERSION 3.18)
project(MyProject LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 填寫自己的clang地址,或者其他編譯器的地址。
# Specify the path to Clang
set(CMAKE_CXX_COMPILER "/opt/homebrew/opt/llvm/bin/clang++")

# Enable module support
add_compile_options(-fmodules)

# 有自建庫時使用
# Add the mathlib library
# add_library(mathlib STATIC mathlib.cpp)

# Add the main executable
add_executable(Ex1_01 Ex1_01.cpp)

# 有自建庫時使用
# Link the mathlib library with the main executable
# target_link_libraries(main PRIVATE mathlib)

在這個程式中,有註釋、輸入輸出函式的引用,名稱空間,結束語句。
在所有程式中,值都可以看作地址之間的對映關係,所以我們這些語句背後都是對記憶體地址的跳轉。使用CMake編譯這個程式,進入C++20的世界。

cmake --build .
./Ex1_01

為了能夠在vscode中自動編譯,而不每次手動修改cmake的內容。
可以使用傳統的launch和tasks
launch配置:

{
    "version": "2.0.0",
    "configurations": [
        {
            "name": "C/C++: clang++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "preLaunchTask": "C/C++: clang++ build active file",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

task:

{
    "version": "2.0.0",
    "configurations": [
        {
            "name": "C/C++: clang++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "preLaunchTask": "C/C++: clang++ build active file",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

build時選擇適配C++20的編譯器

此外,code runner的自動化程度更高,詳細配置就不在這裡描述,只分享下我的setting.json中的配置:

"code-runner.executorMap": {
"cpp": "cd $dir && /opt/homebrew/opt/llvm/bin/clang++ -std=c++20 -fmodules -stdlib=libc++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
}

這裡的/opt/homebrew/opt/llvm/bin/clang++ -std=c++20是我的編譯器地址,和CMake中設定一樣。在複雜的依賴關係中,還是需要使用CMake去定義關係。而簡單的程式設計,一個檔案就能搞定,設定自動化工具肯定更加高效。

關於過程化程式設計和麵向物件程式設計
過程化程式設計自頂向下設計,將過程分為子過程。就如我們要判斷一個迴文質數,先寫一個函式判斷質數,再寫一個函式判斷迴文。最後主程式中執行總判斷。所以現在過程化程式設計在刷題中鍛鍊程式設計師的邏輯思維。
物件導向程式設計有3大特性,封裝,繼承,多型。對資料進行處理,讓它可以模組化的處理。系統的開發都會選用物件導向程式設計,是工作時使用。

相關文章