macOS 下使用 bits/stdc++.h

平时在 Linux 或 OJ 上写 C++,常见写法是:

1
2
#include <bits/stdc++.h>
using namespace std;

但在 macOS 下,默认是 Apple Clang + libc++,不是 Linux 常见的 GCC + libstdc++,所以 bits/stdc++.h 往往不能直接正常工作。

一、目标

要解决的是两件事:

  1. 终端里 g++ 1.cpp 能正常编译 #include <bits/stdc++.h>
  2. Vim 里的 LSP 正常

二、安装 GCC

先安装 Homebrew GCC:

1
brew install gcc

安装后通常会有:

1
2
/opt/homebrew/bin/g++-15
/opt/homebrew/bin/gcc-15

三、使用 g++ 而不是 clang++

macOS 默认 g++ 指向 /usr/bin/g++,而它本质上是 Apple Clang。

~/.zshrc 里添加:

1
2
3
4
5
6
7
export PATH="$HOME/.local/bin:$PATH"
alias gcc=/opt/homebrew/bin/gcc-15
alias g++=/opt/homebrew/bin/g++-15
alias cc=/opt/homebrew/bin/gcc-15
alias c++=/opt/homebrew/bin/g++-15
export CC=/opt/homebrew/bin/gcc-15
export CXX=/opt/homebrew/bin/g++-15

然后执行:

1
2
3
source ~/.zshrc
which g++
g++ --version

期望输出是 /opt/homebrew/bin/g++-15

四、Vim 设置 g++ 编译

.vimrc

1
2
3
4
5
if has('macunix')
se mp=/opt/homebrew/bin/g++-15\ %<.cpp\ -o\ %<\ -Wall\ -Wextra\ -Wno-parentheses
else
se mp=g++\ %<.cpp\ -o\ %<\ -Wall\ -Wextra\ -Wno-parentheses
endif

五、clangd 配置

LSP 常用的是 clangd,它不是 GCC,所以要单独处理。

先写一个包装脚本~/.local/bin/clangd-gcc

1
2
3
4
#!/bin/bash
exec /usr/bin/clangd \
--query-driver=/opt/homebrew/bin/g++-15,/opt/homebrew/bin/gcc-15 \
"$@"

再写 macOS 下实际生效的 clangd 用户配置:

文件 ~/Library/Preferences/clangd/config.yaml

1
2
3
4
5
6
7
8
9
10
CompileFlags:
Add:
- -std=gnu++17
- -nostdinc++
- -isystem
- /opt/homebrew/include/c++/15
- -isystem
- /opt/homebrew/include/c++/15/aarch64-apple-darwin25
- -isystem
- /opt/homebrew/include/c++/15/backward

然后在 Vim 里把 LSP 指到这个 wrapper:

1
2
3
4
5
if has('macunix')
let g:easycomplete_lsp_server = {'cpp': expand('~/.local/bin/clangd-gcc')}
else
let g:easycomplete_lsp_server = {'cpp': '/usr/bin/clangd'}
endif

六、可能的报错

1. 找不到头文件

1
fatal error: 'bits/stdc++.h' file not found

  这说明你还在用系统默认的 Apple Clang / libc++ 环境,没有切到 Homebrew GCC 这套头文件。

  解决方法:

  1. 安装 Homebrew GCC:brew install gcc
  2. ~/.zshrc 里把 g++gcc 切到 /opt/homebrew/bin/g++-15/opt/homebrew/bin/gcc-15
  3. 执行 source ~/.zshrc
  4. which g++ 确认当前拿到的是 Homebrew GCC,而不是 /usr/bin/g++

2. 明明 include 了 bits,却没有 include iostream 等

1
2
1.cpp:8:3: error: use of undeclared identifier 'cin'
1.cpp:9:3: error: use of undeclared identifier 'cout'; did you mean 'count'?

  这次真正的问题不是单纯没 include iostream,而是 bits/stdc++.h 里有条件编译。前面有一行:

1
#if _GLIBCXX_HOSTED

  <iostream><istream><ostream> 这些头都在这个条件后面。

  如果你只是把 GCC 里的 bits/stdc++.h 接到 macOS 默认的 Apple Clang / libc++ 环境里,这个宏环境就不是 GCC 预期的那套,结果就是后面那批头没有按预期生效。于是表面上看是:

  1. bits/stdc++.h 找到了
  2. cincout 还是未定义

  解决方法:

  1. 终端编译统一使用 Homebrew GCC
  2. clangd 通过 ~/.local/bin/clangd-gcc 启动,并带上 --query-driver=/opt/homebrew/bin/g++-15,/opt/homebrew/bin/gcc-15
  3. clangd 统一加上 GCC 的头文件路径,也就是 -nostdinc++ 和三条 /opt/homebrew/include/c++/15...-isystem
  4. Vim 里的 LSP 指到 ~/.local/bin/clangd-gcc

七、最后验证

1
2
3
4
5
6
7
8
9
#include <bits/stdc++.h>
using namespace std;

int a, b;

int main() {
cin >> a >> b;
cout << a + b;
}

终端里执行:

1
g++ 1.cpp -o 1

如果能正常编译,说明编译器这边通了。

再检查 clangd

1
~/.local/bin/clangd-gcc --enable-config --check=1.cpp --log=info

正常的话应看到:

1
All checks completed, 0 errors