在线 C++ 编译器怎么用
- 在编辑器中输入或粘贴 C++ 代码。代码中需要有
int main()。重置示例可恢复初始示例程序。 - 如果您的程序要从
std::cin或std::getline读取数据,请先把输入内容填入输入(stdin)框。 - 按运行,或按 Ctrl + Enter(Mac 上为 ⌘ + Enter)。页面会编译
main.cpp,显示所有诊断信息,然后运行程序。 - 选择 5、15 或 60 秒的时间限制。运行超时后程序会被终止。按停止可立即结束运行。
首次运行时,页面会下载约 30 MB 的 Clang 工具链,之后由浏览器缓存。此后编译一个普通程序用时远不到一秒。复制和 main.cpp 可以帮您保存代码,A−/A+ 调整文字大小,布局按钮可在左右并排和上下堆叠两种窗格之间切换,全屏(Ctrl/⌘ + Shift + F,按 Esc 退出)则让编辑器占满整个窗口。
不会上传任何内容。编译器和您的程序都在您的浏览器中运行,您最新的代码只保存在浏览器的本地存储中。
支持哪些功能
本页面使用真正的 Clang/LLVM 21 编译器,由 YoWASP 项目构建为 WebAssembly 版本。它把您的源代码编译成由浏览器执行的 WebAssembly(WASI)程序。实际执行的命令等同于:
clang++ main.cpp -std=c++20 -O2 -Wall -fno-exceptions -o main.wasm
- C++20:
auto、lambda 表达式、基于范围的for、结构化绑定、constexpr、概念(concepts)和指定初始化器。 - 来自 libc++ 的标准库:
vector、string、map、unordered_map、set、algorithm、numeric、iostream、sstream、iomanip、optional以及其余容器和算法。 - Clang 自身的诊断信息,完全按照编译器的报告输出,带有
main.cpp:line:column位置,包括模板错误和-Wall警告。 main返回非零值时,会显示为 进程已退出,退出码 N。
为什么关闭了异常
C++ 异常在 WebAssembly 中需要额外的运行时支持,而这个浏览器内的工具链并不提供,因此代码使用 -fno-exceptions 编译。所以,不支持 try、throw 和 catch,使用它们的代码会编译失败。通常会抛出异常的库函数,例如对无效输入调用 std::stoi,或用越界索引调用 .at(),在这里也无法捕获。请在转换前先检查输入,用 size() 检查索引,或返回 std::optional 来表示失败:
#include <optional>
#include <string>
std::optional<int> parse(const std::string& s) {
if (s.empty()) return std::nullopt;
int v = 0;
for (char c : s) {
if (c < '0' || c > '9') return std::nullopt;
v = v * 10 + (c - '0');
}
return v;
}
其他限制
- 不支持线程:
std::thread、std::async和 pthreads 均不可用。 - 没有网络,不支持
fork/exec,也没有真正的文件系统,所以std::ifstream无法读取您电脑上的文件。请改用 stdin。 - 不支持图形或 GUI 库,例如 Qt、SFML 或 OpenGL。只能输出文本。
- 没有安装 Boost 等第三方库。所有代码都必须写在单个
main.cpp文件中。
几行代码看现代 C++
初始示例程序展示了让现代 C++ 比老式教科书代码更简洁的写法:
std::map<std::string, int> ages{ {"Ada", 36}, {"Linus", 54} };
for (const auto& [name, age] : ages) // structured bindings
std::cout << name << " is " << age << '\n';
std::vector<int> v{5, 3, 9, 1};
std::sort(v.begin(), v.end(), std::greater<>());
auto evens = std::count_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; });
- 在循环中优先使用
'\n'而不是std::endl。endl还会刷新输出流,速度更慢。 - 混用
std::cin >> n和std::getline时,请先调用std::cin.ignore(),否则getline会把上一行剩下的部分读成空字符串。 - 对
std::map使用operator[]时,如果键不存在,会插入一个默认值。要在不改变 map 的情况下查找键,请用find或contains(C++20)。
常见问题
使用哪个 C++ 标准?
C++20,由 Clang 21 以 -O2 -Wall 编译。为 C++11、C++14 或 C++17 编写的代码也能编译。
为什么带 try/catch 的代码无法编译?
异常已通过 -fno-exceptions 禁用。请改用返回值、std::optional,或在有风险的操作之前进行显式检查。
可以使用 bits/stdc++.h 吗?
不可以。这个头文件是 GCC 特有的,libc++ 中没有。请包含您需要的标准头文件,例如 <iostream>、<vector> 和 <algorithm>。
有纯 C 版本吗?
有,C语言在线编译器使用同样的 Clang,以 C17 模式编译。您也可以浏览本站所有在线编译器。
更新于
评论
登录后即可为此工具评分。
分享技巧、提出问题,或说说这个工具对您是否有用。
还没有评论,来分享您的使用体验吧。