MacOS 使用 <bits/extc++.h> 標頭檔 (以 VSCode 為例)

前言

先說結論,如果用 Clang 作為編譯器是難以使用 <bits/extc++.h> 標頭檔的,會產生各種神奇報錯,本文採取適用 Homebrew 安裝 GCC 的方式,並且使用 GCC 作為編譯器。

本來在寫 CSES 想要用看看 pbds,啊結果發現完全沒辦法用,網路上到處找好像都沒什麼解決方法,研究一番之後就有了這篇文章。

安裝 Homebrew (如果沒有的話)

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安裝 GCC

這邊可以選擇安裝不同版本的 GCC,但要注意 Arm 架構(M 系列晶片)的 Mac 只有支援 GCC 11 以上的版本。

1
2
3
4
5
# 安裝最新版本的GCC
brew install gcc

# 安裝GCC 11
brew install gcc@11

使用 GCC 編譯器

如果不知道安裝的 GCC 版本,可以使用以下指令查看:

1
2
ls /usr/local/bin/gcc*  # Intel Mac
ls /opt/homebrew/bin/gcc* # Apple Silicon Mac

確定了 GCC 的確切版本號(例如 gcc-11),可以使用該版本號的 GCC 編譯您的程式碼。 例如,如果 GCC 版本是 11,則執行:

1
2
3
4
g++-11 example.cpp -o Example

# 如果你想使用特定版本的c++編譯(例如c++11),可以執行
g++-11 example.cpp -o example -std=c++11

在 VSCode 中使用 GCC

使用 C/C++ Compile Run 插件

進入到插件設定頁面,搜尋 C-cpp-compile-run: Cpp-compiler,設定使用 gcc 編譯。 設定使用gcc編譯

使用 Competitive Programming Helper (cph) 插件

進入到插件設定頁面,搜尋 cph.language.cpp.Command,設定使用 gcc 編譯。 設定使用gcc編譯

結語

這樣就可以在 MacOS 上使用 <bits/extc++.h> 標頭檔了,可以試試底下這個程式碼能否正常運行:

1
2
3
4
5
6
7
8
9
10
11
12
#include <bits/extc++.h>

using namespace __gnu_pbds;
using namespace std;

int main() {
tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> s;
s.insert(1);
s.insert(3);
cout << *s.find_by_order(1) << '\n'; // 輸出第二個元素(3)
return 0;
}

如果對在 MacOS 上使用 GCC 和 <bits/extc++.h> 標頭檔有任何問題,歡迎在下方留言討論。