vscode运行C++20,支持模块的实现。

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大特性,封装,继承,多态。对数据进行处理,让它可以模块化的处理。系统的开发都会选用面向对象编程,是工作时使用。

posted @ 2024-06-10 18:14  FischerWu  阅读(838)  评论(0)    收藏  举报