Analisis statis pada chapter sebelumnya menilai makna kode: lupa melepas memori, cabang yang mustahil tercapai. Ada kategori perselisihan lain yang jauh lebih sering muncul di diskusi tim: format — indentasi dua atau empat spasi, spasi sebelum kurung buka, panjang baris maksimal, urutan #include. Pertanyaan-pertanyaan ini tidak punya jawaban benar atau salah, tetapi tetap memakan waktu di code review bila setiap anggota tim membawa gayanya sendiri. clang-format menyelesaikannya dengan cara paling efisien: mengambil keputusan itu sekali di sebuah berkas konfigurasi, lalu memformat seluruh kode secara otomatis dan identik untuk semua orang. clang-format tidak terinstal di sandbox penulis, sehingga perintah dan hasilnya kita tampilkan sebagai ilustrasi — tetapi program contohnya tetap kita kompilasi dan jalankan sungguhan.
Mengapa Format Konsisten Itu Penting #
Manfaat pertama terasa di diff. Bila gaya penulisan berbeda antar anggota tim, satu commit kecil bisa berisi puluhan baris berubah yang isinya hanya spasi dan indentasi — perubahan logika yang sebenarnya jadi tenggelam di antara noise. Dengan format seragam, setiap baris yang berubah pada diff hampir pasti berarti, dan reviewer bisa memusatkan perhatian pada logika. Manfaat kedua terasa di git blame dan riwayat commit: baris tidak lagi “berpindah” hanya karena seseorang memformat ulang berkas, sehingga jejak siapa yang terakhir mengubah sebuah logika tetap bisa dilacak.
Manfaat ketiga bersifat kumulatif: kode yang seragam terasa seperti ditulis satu tangan, dan pembaca baru mengenali pola lebih cepat karena semua berkas berbicara dengan gaya yang sama. Yang paling penting, format adalah kelas keputusan yang paling murah untuk didelegasikan ke alat — tidak ada penilaian semantik, hanya aturan mekanis. Delegasikan ke alat, dan seluruh perdebatan gaya di review berhenti secara alami.
Berkas berikut adalah contohnya: logikanya benar dan berjalan baik, tetapi bentuknya campur aduk — include yang menjorok, dua function digabung dalam satu baris, spasi yang tak konsisten:
// berantakan.cpp — logikanya benar dan berjalan baik, formatnya tidak konsisten.
#include <iostream>
#include <vector>
int jumlahkan(std::vector<int> v){int total=0;for(int x:v)total+=x;return total;}
void cetak(std::string judul, int nilai)
{
std::cout << judul << ": " << nilai << '\n';
}
int main() {
std::vector<int> data = {3, 9, 4};
int hasil=jumlahkan(data);
cetak( "total" ,hasil );
return 0;
}Output yang Dihasilkan:
total: 16Compiler menerima semua itu tanpa protes — indentasi pada #include sah secara bahasa, dan pemadatan int total=0;for(int x:v)total+=x; hanyalah gaya. Sekarang jalankan pemformat:
clang-format -i berantakan.cppFlag -i berarti in place: berkas ditulis ulang langsung pada tempatnya, tanpa mencetak hasil ke terminal. Dengan konfigurasi yang akan kita buat di bawah, hasilnya kurang lebih seperti ini (ilustrasi format, karena clang-format tidak terinstal di sandbox):
// berantakan.cpp — logikanya benar dan berjalan baik, formatnya tidak konsisten.
#include <iostream>
#include <vector>
int jumlahkan(std::vector<int> v) {
int total = 0;
for (int x : v) total += x;
return total;
}
void cetak(std::string judul, int nilai) {
std::cout << judul << ": " << nilai << '\n';
}
int main() {
std::vector<int> data = {3, 9, 4};
int hasil = jumlahkan(data);
cetak("total", hasil);
return 0;
}Yang berubah semuanya bentuk: indentasi include dirapikan, tubuh function dibuka per statement dengan empat spasi, dan ekspresi seperti hasil=jumlahkan(data) serta cetak( "total" ,hasil ) diberi spasi yang konsisten. Yang tidak berubah sama sekali adalah logika — kita sudah menguji versi terformat ini sendiri di sandbox, dan outputnya tetap total: 16. Jaminan itulah yang membuat reformat massal aman dilakukan: clang-format memindahkan karakter, bukan makna. Perhatikan juga bahwa baris kosong yang sudah ada dipertahankan; clang-format menata tampilan baris, bukan menambah atau menghapus baris.
Konfigurasi Proyek: Berkas .clang-format #
clang-format membaca konfigurasi dari berkas bernama .clang-format di root repositori. Mode --style=file (yang sudah menjadi bawaan di versi-versi terbaru) membuatnya mencari berkas itu dari direktori berkas yang diformat ke atas, sehingga seluruh subdirektori proyek otomatis mengikuti satu konfigurasi. Satu berkas, semua anggota tim, semua build CI — tidak ada yang perlu diatur ulang per orang:
BasedOnStyle: Google
IndentWidth: 4
ColumnLimit: 100
DerivePointerAlignment: false
PointerAlignment: LeftMakna tiap kunci:
BasedOnStyle: Google— mewarisi seluruh aturan dari preset Google; kita cukup menuliskan pengecualian, bukan ratusan opsi dari nol.IndentWidth: 4— menimpa indentasi dua spasi milik Google menjadi empat spasi, sesuai selera proyek.ColumnLimit: 100— baris yang melebihi 100 karakter dilipat ke baris berikutnya dengan indentasi yang rapi.PointerAlignment: Left— menegaskanint* p(bintang menempel tipe) secara permanen;DerivePointerAlignment: falsemencegah clang-format meniru gaya lama berkas yang sudah ada.
Style Bawaan: Google, LLVM, dan Kawan-kawan #
Anda tidak harus menulis konfigurasi dari awal — clang-format membawa beberapa preset yang dihasilkan dari codebase nyata:
| Style | Indent bawaan | Ciri yang mudah dikenali |
|---|---|---|
| LLVM | 2 spasi | gaya asli ekosistem Clang/LLVM |
| 2 spasi | loop pendek boleh satu baris; include tersusun rapat | |
| Chromium | 4 spasi | turunan Google dengan indentasi lebih lebar |
| Mozilla | 4 spasi | kurung kurawal function di baris sendiri |
| Microsoft | 4 spasi | kurung kurawal selalu di baris sendiri |
Karena BasedOnStyle hanya fondasi, perbedaan antar proyek tetap terasa: dua tim yang sama-sama memakai preset Google bisa berbeda di IndentWidth atau ColumnLimit — dan keduanya benar, karena kebenaran ada di berkas .clang-format mereka, bukan di selera individu. Aturan praktis untuk proyek baru: mulai dari satu preset, gunakan beberapa minggu, lalu tambahkan pengecualian hanya bila benar-benar mengganggu keterbacaan tim Anda.
Integrasi Editor dan Disiplin Tim #
Nilai terbesar clang-format muncul ketika format berjalan tanpa perlu dipikirkan. Tiga titik integrasi yang paling umum:
- Format-on-save: editor populer (VS Code dengan ekstensi C/C++, Clion, Vim, Neovim) bisa memanggil clang-format setiap kali berkas disimpan; konfigurasikan agar mengikuti
.clang-formatproyek, dan tidak ada satu pun baris berantakan yang sempat ter-commit. - Pre-commit hook: skrip
clang-format-diff.pydari repositori LLVM memeriksa hanya baris yang berubah pada commit dan menolaknya bila belum terformat — cocok untuk tim besar yang tidak ingin memformat ulang berkas lama sekaligus. - CI:
clang-format --dry-run --Werror src/*.cppmemeriksa tanpa menulis, dan mengembalikan kode gagal bila ada berkas yang menyimpang — pipeline berhenti sebelum kode tak terformat masuk kemain.
clang-format menata karakter dan berhenti di situ — ia tidak pernah menilai apakah parameter sebaiknya lewat reference, apakah loop gaya 1990-an itu perlu dimodernisasi, atau apakah 0 untuk pointer itu ambigu. Menilai makna baris demi baris adalah pekerjaan alat yang berbeda: clang-tidy, yang kita uji pada chapter berikutnya.
Referensi: Clang — ClangFormat , Clang — Style Options .