C++ 快速上手:环境搭建与第一个程序
更新时间:2026-08-27。本文是
languages/cpp/主题入门层第 0 篇,整个 C++ 系列的第一站。目标只有一个:在你机器上把 g++ 跑起来,编译出第一个 C++ 程序,并顺手对比一下它和 C 的第一个程序差在哪。别急着背语法,先把"写代码 → 编译 → 运行"这条路走通。
本文要回答的问题
- 写 C++ 需要装什么?跟写 C 有什么不同?
- 第一个 C++ 程序和 C 的
hello.c差在哪? - 为什么本站坚持
-O0 -g编译,-std=c++17又是什么?
一、准备工作:g++ 在哪
写 C++ 需要的东西跟 C 几乎一样:一个编辑器加一个编译器。唯一区别是编译器要会用 g++(GCC 对 C++ 的编译器前端)。
| 工具 | 作用 | 常用选择 |
|---|---|---|
| 编辑器 | 写代码 | Vim、VS Code、Neovim |
| 编译器 | 编译代码 | g++(GCC)、clang++(Clang) |
在 Ubuntu / Debian 上,C 的 build-essential 已经包含 g++,装过就不用再装:
sudo apt update && sudo apt install -y build-essential
g++ --version # 验证:能打印出版本号就说明装好了macOS 装 Xcode Command Line Tools 后自带 clang++(用法与 g++ 基本一致);Windows 推荐 WSL 或 MSYS2。本站所有示例都假定你在 Linux 上——理由和 C 一样:perf、/proc、火焰图这些剖析手段只有 Linux 才有。
二、第一个程序:和 C 只差三行
建个目录,写一个 hello.cpp:
#include <iostream>
int main() {
std::cout << "Hello, 极客教程" << std::endl;
return 0;
}编译运行:
g++ -O0 -g -std=c++17 -o hello hello.cpp
./hello输出:Hello, 极客教程。
如果你刚看完本站的 C 入门,一眼就能看出差别——C 和 C++ 的第一个程序长得几乎一样,但有三处不同:
| 对比项 | C(hello.c) | C++(hello.cpp) |
|---|---|---|
| 头文件 | #include <stdio.h> | #include <iostream> |
| 输出 | printf("...\n") | std::cout << "..." << std::endl |
| 编译命令 | gcc | g++ |
main 返回 int、return 0 表示正常结束,这些和 C 完全一致——echo $? 依然能看到退出码。C++ 被称为"带类的 C"不是没道理的,语法地基是同一个。
三、std::cout 到底是什么
先别被这串符号吓到,拆开看:
std是命名空间(namespace),C++ 标准库的东西都放在里面,防止和你自己的变量重名;cout是"character output"——标准输出流,你可以把它理解成"屏幕";<<是流插入运算符,意思就是"把右边的数据送进左边的流里",可以连着写:cppstd::cout << "结果是 " << 42 << std::endl;std::endl是"换行并刷新输出缓冲"。
所以 std::cout << "Hello" << std::endl; 读作:"往屏幕输出 Hello,然后换行"。<< 能自动识别类型——你输出 int、double、字符串都行,不用像 printf 那样记 %d、%s。这正是 C++ 的"零成本抽象"理念在第一天就能摸到的地方:用起来比 printf 省心,底层性能却不打折。
关于 std::endl 有个细节值得提一句:它除了换行还会刷新缓冲,频繁输出大日志时比 '\n' 慢。性能敏感的循环里建议用 '\n'。入门阶段两者随便用,知道这个区别就行,高手层的流式 IO 深挖还会再讲。
四、为什么本站坚持 -O0 -g(和 C 同一个理由)
这俩参数在 C 入门篇里讲过,这里复述要点,因为 C++ 同样适用:
| 参数 | 作用 | 本站的理由 |
|---|---|---|
-O0 | 不做优化,保留直白的指令序列 | perf 火焰图里每行 C++ 代码都能对应到汇编 |
-g | 生成调试符号与行号 | perf 能定位到具体源码行,gdb 能断点调试 |
本站 demos/cpu-demo 正是 C++ 写的——-O2 下编译器把热点循环整个消除,那是教学点;学习阶段 -O0 -g 才能看到"自己写的代码真实跑出来的样子"。
五、-std=c++17 又是干嘛的
C++ 标准隔几年更新一次:C++11 → C++14 → C++17 → C++20 → C++23。编译器默认的标准可能偏旧,显式指定能保证你用的特性一定可用。本站约定新代码按 C++17(-std=c++17),个别实验用 C++20。具体每个版本带来什么,总纲C++11~23 关键特性地图有表,现在记住这个编译命令就行:
g++ -O0 -g -std=c++17 -o hello hello.cpp六、用 make 管理编译
和 C 一样,文件多了就用 Makefile。本站 demos 每个 C++ 实验目录都自带 Makefile,cd 进去 make 即可:
hello: hello.cpp
g++ -O0 -g -std=c++17 -o hello hello.cpp
clean:
rm -f hello七、常见的"跑不起来"
| 现象 | 原因 | 解决 |
|---|---|---|
command not found: g++ | 没装编译器 | 回到第一节装 build-essential |
iostream: No such file or directory | 用 gcc 编 C++ | 用 g++ 编译 |
undefined reference to 'main' | 文件里没有 main | 检查是否写了 int main() |
error: 'cout' was not declared | 没写 std:: 或没 include | 检查 #include <iostream> 与 std::cout |
permission denied | 没有执行权限 | 用 ./hello 运行,或 chmod +x hello |
第三行值得多说一句:'cout' was not declared 是新手高频报错,多半是把 std:: 漏了。cout 住在 std 命名空间里,不写前缀它找不到你。
八、与本站主线衔接
- 本站全部 demo 都按
-O0 -g -std=c++17约定构建,见demos/cpu-demo; - C++ 的对象、
std::string、std::vector等内存布局,是专家层对象内存布局的内容; - 程序怎么被加载、
main之前发生了什么,见 L5 ELF 与装载; - 如果你还没读过 C 的入门,C 语言快速上手有更细的环境讲解,本篇与之配套。
一句话总结
装好 g++、写个 hello.cpp、用 g++ -O0 -g -std=c++17 -o hello hello.cpp 编译、./hello 运行——C++ 的第一课就走通了;和 C 的差别只在 iostream/std::cout/g++ 三处,-O0 -g 保留真相、-std=c++17 锁定标准,接下来就是语法与对象的世界。
上一篇:C++ 现代特性主题总纲 下一篇:cin 与 cout:iostream 输入输出