Menu

C++ Hello World:逐行讲解你的第一个程序

逐行讲解 C++ 的 Hello World 程序:#include <iostream>、int main()、std::cout 和 <<、std::endl 与 '\n' 的区别、return 0,以及如何编译它、如何修复初学者最先遇到的错误。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

程序

下面是完整的 C++ Hello World 程序。点击“运行”即可在浏览器中编译并执行:

它会打印一行:

Hello, World!

只有五行代码,每一行都有明确的作用。下面按顺序逐行讲解,然后介绍如何在你自己的电脑上编译同一个文件,以及最初遇到的编译错误通常是什么意思。

逐行讲解

#include <iostream>

以 # 开头的行是给预处理器的指令,预处理器在真正的编译器之前运行。#include <iostream> 会把标准头文件 <iostream>(输入/输出流)中的声明粘贴进来。std::cout 和 std::endl 就声明在这个头文件里。C++ 没有内置的打印语句,打印功能属于标准库,用这一行把它引入进来。

int main() {

每个 C++ 程序都从名为 main 的函数开始运行。程序中必须有且只有一个 main,而且必须全部小写。前面的 int 表示 main 结束时会向操作系统返回一个整数。空括号表示这里它不接收任何参数,左花括号 { 标志着函数体的开始。

std::cout << "Hello, World!" << std::endl;

真正负责打印的就是这一行。

  • std::cout 是标准输出流,通常就是终端。std:: 前缀表示 cout 位于 std 命名空间中,整个标准库都放在这个命名空间里。
  • << 是插入运算符,它把右边的值送进左边的流。它可以连续使用,每个 << 都会把下一部分追加到同一个输出中。
  • "Hello, World!" 是一个字符串字面量:用双引号括起来的文本。
  • std::endl 结束当前行。
  • 分号结束这条语句。C++ 中每条语句都需要分号。

return 0;

return 结束 main,并把一个值交还给操作系统。按照惯例,0 表示程序运行成功,其他任何数字都表示出错。脚本和构建工具会读取这个退出码。在 main 中这一行可以省略:如果执行到了右花括号,C++ 会当作你写了 return 0;。

右花括号

右花括号结束 main 的函数体,程序也随之结束。

std::endl 与 '\n'

结束一行有两种常见写法,实际代码中两种都会出现:

输出:

Hello, World!
Hello again!
Line one
Line two

看到的结果完全一样。区别在于 std::endl 写入换行符后还会刷新流,把缓冲区里的文本立即推送到终端。'\n' 只写入换行符,流按自己的节奏刷新(最迟在程序结束时)。在一个打印成千上万行的循环中,std::endl 带来的额外刷新会造成明显的性能差异,所以很多 C++ 程序员默认使用 '\n',只在文本必须立即显示时才用 std::endl。如第三行所示,转义字符 \n 也可以直接写在字符串里。输入和输出页面更深入地介绍了 cout 和 cin。

使用 using namespace std; 的版本

很多教程会这样写 Hello World:

using namespace std; 让编译器在找不到某个名字时去 std 命名空间中查找,所以 cout 和 endl 不加前缀也能使用。在小程序和练习中这样写没问题。但在较大的代码和头文件中通常会避免这种写法,因为它会把数百个标准库名字引入作用域,可能与你自己定义的名字冲突(例如你写了一个叫 count 或 distance 的函数)。多写五个字符 std::,就能消除这个风险。

在你的电脑上编译并运行 Hello World

浏览器中的编辑器会替你完成编译。在自己的电脑上,你需要亲自完成同样的两步:先把源文件编译成可执行文件,再运行这个可执行文件。首先要安装一个 C++ 编译器,安装指南介绍了如何在 Windows、macOS 和 Linux 上配置。

把程序保存为 hello.cpp,在同一文件夹中打开终端,然后编译:

g++ hello.cpp -o hello

如果没有任何输出,就说明编译成功了,源文件旁边会多出一个名为 hello 的可执行文件(Windows 上是 hello.exe)。运行它:

./hello

在 Windows 上,改为运行 hello.exe 或直接输入 hello。在 macOS 上,clang++ hello.cpp -o hello 的用法完全相同,而那里的 g++ 通常只是换了个名字的 Clang。

有两组选项值得从一开始就加上:-std=c++17(或 -std=c++20)用来选择语言标准,-Wall -Wextra 用来开启能发现真正错误的警告:

g++ -std=c++17 -Wall -Wextra hello.cpp -o hello

编译 C++ 页面解释了这些选项的作用、-o 的含义,以及为什么不加它会得到一个叫 a.out 的文件。

最初常见的错误

下面的错误信息来自 GCC(g++)。Clang 的措辞不同,但指向的是同一行。

缺少分号。

hello.cpp:5:5: error: expected ';' before 'return'

编译器要读到下一个记号时才会发现缺少 ;,所以行号通常指向出错位置的下一行。请检查上一行的末尾。

缺少 #include <iostream>。

error: 'cout' is not a member of 'std'

std::cout 声明在 <iostream> 中。在文件顶部加上这条 include。

缺少 std::。

error: 'cout' was not declared in this scope; did you mean 'std::cout'?

要么写成 std::cout 和 std::endl,要么在 include 之后加上 using namespace std;。

把 main 写成了 Main。 C++ 区分大小写。使用 int Main() 的程序可以通过编译,但在链接阶段会失败,报错 undefined reference to 'main',因为链接器找不到程序应当开始执行的那个函数。

用 gcc 而不是 g++ 编译。 gcc hello.cpp 能编译 C++ 代码,但不会链接 C++ 标准库,于是会得到一长串 undefined reference to std::... 错误。C++ 文件请用 g++(或 clang++)编译。

弯引号。 从文字处理软件或网页复制来的代码,可能包含排版用的弯引号(“Hello”),而不是直引号("Hello")。GCC 会报告 stray '\342' in program。在编辑器中重新输入引号即可。

旧式头文件和 void main。 一些非常老的教程会使用 #include <iostream.h> 或 void main()。两者都不是标准 C++:头文件是不带 .h 的 <iostream>,而 main 必须返回 int。现代编译器会拒绝这两种写法。

C++23 中用 std::println 打印

C++23 新增了一种更简短的打印一行的方式,即 <print> 头文件中的 std::println:

#include <print>

int main() {
    std::println("Hello, World!");
}

它会自动添加换行符,并支持用 {} 占位符插入值。GCC 14、使用 libc++ 的 Clang 18 以及较新版本的 Visual Studio 都已支持它,编译时需要加上 -std=c++23。现有的大部分代码和教程仍然使用 std::cout,所以两种写法都值得熟练掌握。

常见问题

C++ 怎么写 Hello World?

先写 #include <iostream>,然后定义 int main(),在其中写上 std::cout << "Hello, World!" << std::endl;,接着是 return 0;。把文件保存为 hello.cpp,用 g++ hello.cpp -o hello 编译,再运行 ./hello。

为什么 C++ 的 Hello World 需要 #include <iostream>?

std::cout 和 std::endl 声明在 <iostream> 头文件中,并不是语言内置的。缺少这条 include,编译器就不认识这些名字,会报出类似 'cout' is not a member of 'std' 的错误并停止编译。

std::endl 和 '\n' 有什么区别?

两者都会结束当前行。std::endl 还会刷新输出缓冲区,强制文本立即输出。'\n' 只写入换行符,由流在合适的时候自行刷新,打印很多行时速度更快。只打印一行 Hello World 时,看不出任何区别。

C++ 的 main 函数末尾一定要写 return 0 吗?

不一定。main 是 C++ 唯一允许省略 return 的函数:执行到右花括号时等同于 return 0;,告诉操作系统程序运行成功。很多人仍然会写上它,让退出状态一目了然。

Coddy 编程语言插图

和 Coddy 一起学编程

开始