制器坊 编程基础

C++ 基础:源码、标准库、构建与模板报错

保存并编译一个 C++ 程序,识别第一条真实错误。配合操作示例、图解和检查点,完成第一次练习,再逐步排查使用中的问题。

信息层级:【有据可查】= 附官方文档或可信来源链接;【社区共识】= 社区用户普遍经验,未经官方确认;【待考察/推测】= 推测或暂未能核实,请谨慎对待。

权威参考:cppreference、C++ Core Guidelines。【有据可查】


1. C++ 是什么?

【社区共识】C++ 在 C 的基础上加入了类、模板、标准库(STL)、RAII 等。用于游戏引擎(Unreal,见 游戏引擎怎么选:目标平台、学习成本与许可)、高性能计算、浏览器、推理引擎(如 llama.cpp)等。

对比 C C++ 多了什么
手动 malloc/free RAII + 智能指针,离开作用域自动释放
字符数组 std::string
手写数组/链表 std::vector、std::map 等容器
函数 类、继承、模板、lambda

2. Hello World

#include <iostream>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> names{"Alice", "Bob"};
    for (const auto& n : names) {
        std::cout << "Hello, " << n << "!\n";
    }
    return 0;
}
g++ -std=c++20 -Wall -Wextra -g main.cpp -o main && ./main

3. 现代 C++ 语法速查

主题 示例 说明
自动类型推断 auto x = 3.14; 编译器推断类型
引用 void f(const std::string& s) 避免拷贝;const 表示不修改
范围 for for (auto& v : vec) 遍历容器
类 class Dog { public: void bark(); private: int age_; }; 封装
构造/析构 Dog() {...} / ~Dog() {...} RAII 的基础
智能指针 auto p = std::make_unique<Dog>(); 自动释放;共享用 std::shared_ptr
lambda auto add = [](int a, int b){ return a + b; }; 匿名函数
模板 template<typename T> T max(T a, T b) 泛型
命名空间 namespace game { ... } 避免重名
异常 try { ... } catch (const std::exception& e) { ... } 错误处理

4. 常用标准库

头文件 常用内容 用途
<iostream> std::cout / std::cin / std::cerr 输入输出
<string> std::string、.size()、.substr()、.find()、std::to_string 字符串
<vector> push_back、emplace_back、size、at(带越界检查) 动态数组
<map> / <unordered_map> insert、find、operator[]、contains(C++20) 字典
<algorithm> std::sort、std::find、std::count_if、std::max 算法
<memory> std::unique_ptr、std::shared_ptr、std::make_unique 内存管理
<optional> std::optional<T> 可能没有值
<filesystem> std::filesystem::path、exists 文件路径
<chrono> 计时 性能测量
<thread> / <mutex> 线程与锁 并发

来源:cppreference 标准库头文件【有据可查】


5. 读懂报错:C++ 报错为什么那么长?

【社区共识】模板展开会让一个小错误产生几十上百行报错。诀窍:找第一条 error:,并在长串中寻找"你自己的文件名"那一行。

图 1

5.1 常见错误对照表

报错关键词 常见原因 处理
no matching function for call to ... 参数类型/个数不对;后面的 note: candidate 列出了可选版本 对照 candidate 修改参数
no match for 'operator<<' 试图打印一个没定义输出方式的类型 打印其成员,或为该类型重载 <<
'xxx' was not declared in this scope 缺头文件、缺 std::、拼写错误 加 #include 或 std:: 前缀
use of deleted function 试图拷贝不可拷贝的对象(如 unique_ptr) 用 std::move 或改用引用
undefined reference to 'Foo::bar()' 声明了但没实现,或 .cpp 没参与编译/链接 检查实现与构建系统(CMake)
multiple definition of ... 在头文件里定义了非 inline 函数/变量 移到 .cpp 或加 inline
terminate called after throwing an instance of 'std::out_of_range' 运行时 .at() 越界 检查下标
Segmentation fault 悬空指针/引用、越界 -fsanitize=address

5.2 构建系统报错

【社区共识】中大型项目多用 CMake。CMake Error: Could not find a package configuration file provided by "XXX" 通常表示依赖库未安装或路径没告诉 CMake。


6. 和 AI 协作的提示【社区共识】

  • 让 AI 写"现代 C++"(C++17/20)、优先智能指针与标准容器,避免裸 new/delete。
  • 贴报错时,只贴第一条 error 及其上下几行 + 你的代码,避免整屏模板噪音。
  • Unreal 的 C++ 有大量引擎宏(UCLASS、UPROPERTY 等),报错要结合引擎文档看。

7. 本篇无法核实/需谨慎的点

  • MSVC 与 GCC/Clang 报错格式差异较大,本文以 GCC 为例。
  • 各编译器对 C++20/23 特性的支持程度随版本变化。

小白练习:把本文流程逐项走通

练习目标:保存并编译一个 C++ 程序,识别第一条真实错误。

上文已介绍概念、配置和操作示例。下面侧重第一次实际操作时的顺序、检查点和结果核对;需要查具体参数时回到对应小节。命令逐条输入,看到上一条的结果后再继续。

  1. 先运行 g++ --version,确认安装了 C++ 编译器;gcc 与 g++ 的编译、链接默认行为不同。

    补充说明:g++ 负责 C++ 编译与链接;查看版本输出后,再核对编译器是否支持示例的 C++20 标准。

  2. 把原文代码保存成 main.cpp,打开扩展名显示,再切换终端到文件所在目录。

    补充说明:保存上文完整 Hello World,采用 UTF-8。Windows“另存为”可选“所有文件”,确认实际名称不是 main.cpp.txt。

  3. 先执行编译命令中 && 左边的部分。出现 error 时先修第一条自己的源码错误,不继续运行旧程序。

    补充说明:单独编译的命令为 g++ -std=c++20 -Wall -Wextra -g main.cpp -o main。-std=c++20 选择标准,其余参数分别控制警告、调试信息和输出名。

  4. 编译成功后单独运行生成的程序。Linux 或 Bash 用 ./main,Windows PowerShell 的 Windows 目标通常用 .\main.exe。

    补充说明:运行方式取决于终端与编译目标。编译尚未成功时,不要运行目录里以前留下的 main 或 main.exe。

  5. 预期按顺序出现 Alice 和 Bob 两行问候。修改名单后重新编译,检查输出是否改变。

    补充说明:完整输出应为 Hello, Alice! 与 Hello, Bob! 两行。names 保存名字,范围 for 逐个取出,const auto& 通过只读引用访问当前名字,std::cout 输出文字。可增加 "Carol" 后重新编译验证。

  6. 遇到模板错误时保留第一条 error、指向自己文件的 note 和编译命令,按原文方法一起定位。

    补充说明:语法表中的 vec、Dog 等是片段对象,需要所在程序的定义;不能逐行追加到 Hello World。报错示例中的标准库文件和自己的源码要分开定位。

继续浏览制器坊 返回顶部 ↑
教程图解100%
教程图解
灵犀台