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