Setiap contoh di course ini melewati jalur yang sama: g++ -std=c++23 -Wall -Wextra, diikuti eksekusi program. Jalur itu melibatkan banyak alat yang selama ini bekerja diam-diam — compiler dengan ratusan flag, standard library, linker, hingga build system. Chapter ini memetakan dokumentasi resmi alat-alat tersebut, karena ketika program berperilaku berbeda antar mesin, jawabannya hampir selalu ada di dokumentasi toolchain, bukan di tutorial. Di akhir chapter, kita menulis program yang melaporkan sendiri profil compiler yang sedang menjalankannya.
Dokumentasi Resmi Tiga Compiler Utama #
- GCC Online Docs
— manual lengkap GCC; bagian Warning Options
merinci setiap flag
-Wyang kita pakai sepanjang course. Implementasi standard library-nya, libstdc++, punya dokumentasi sendiri termasuk manual dan status konformansi. - Clang Docs — dokumentasi Clang; Diagnostics Reference menjelaskan setiap peringatan, dan libc++ adalah standard library pendampingnya di dunia LLVM.
- MSVC C++ Docs — dokumentasi Microsoft untuk compiler Visual Studio; implementasi standard library-nya juga terbuka di GitHub microsoft/STL , lengkap dengan catatan konformansi C++23.
Kebiasaan yang berguna: ketika sebuah warning muncul dan kita tidak yakin maksudnya, cari nama warning itu di dokumentasi compiler yang bersangkutan. Pesan peringatan GCC dan Clang sering mirip tetapi tidak identik, dan dokumentasinya menjelaskan pola kode yang memicunya beserta cara menulis yang lebih baik.
Compiler Explorer: Laboratorium Eksperimen #
Compiler Explorer (godbolt.org) adalah situs yang memungkinkan kita menulis potongan C++, mengompilasinya dengan puluhan compiler dan versi, lalu melihat hasil assembly-nya berdampingan. Alat ini menjadi favorit untuk tiga pekerjaan: membandingkan output GCC dengan Clang saat ragu soal perilaku, melihat efek flag optimasi pada kode yang sama, dan memeriksa apakah fitur baru sudah tersedia tanpa menginstal apa pun. Tautan berbagi memuat kode dan pilihan compiler, sehingga percobaan yang kita diskusikan dengan rekan kerja bisa direproduksi persis. Untuk percobaan cepat sehari-hari, ini sering lebih ringkas daripada membuat proyek lokal.
Dokumentasi Sanitizer dan Build System #
Dua kelompok dokumentasi lain yang menopang course ini:
- Sanitizer — AddressSanitizer, UndefinedBehaviorSanitizer, dan ThreadSanitizer yang kita pakai pada section Debugging terdokumentasi di opsi instrumentasi GCC dan dokumen AddressSanitizer Clang ; keduanya menjelaskan flag yang tersedia dan jenis bug yang tertangkap.
- Build system dan manajer dependensi — manual CMake untuk sistem build de facto, vcpkg dan Conan untuk manajemen library pihak ketiga. Section Build System course ini mengajarkan pemakaiannya; dokumentasi resmi ini adalah rujukan lanjutannya.
Membaca Profil Build lewat Macro #
Compiler melaporkan identitasnya lewat macro preprocessor, dan membacanya adalah cara resmi mengetahui lingkungan yang sedang kita hadapi. Program berikut mencetak profil itu sendiri:
#include <iostream>
// Profil lingkungan build: macro yang dilaporkan compiler saat kompilasi.
// Jalankan di compiler berbeda dan bandingkan hasilnya.
int main() {
std::cout << "Profil build program ini:\n";
#ifdef __clang__
std::cout << "Compiler : Clang " << __clang_major__ << "." << __clang_minor__ << "\n";
#elif defined(__GNUC__)
std::cout << "Compiler : GCC " << __GNUC__ << "." << __GNUC_MINOR__ << "\n";
#else
std::cout << "Compiler : tidak dikenal\n";
#endif
std::cout << "Standar : " << __cplusplus << "\n";
#ifdef __VERSION__
std::cout << "Versi : " << __VERSION__ << "\n";
#endif
#ifdef __BYTE_ORDER__
if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) {
std::cout << "Endian : little-endian\n";
} else {
std::cout << "Endian : big-endian\n";
}
#endif
#ifdef __STDC_HOSTED__
std::cout << "Hosted : " << __STDC_HOSTED__
<< " (1 = library lengkap, 0 = freestanding)\n";
#endif
return 0;
}Output yang Dihasilkan:
Profil build program ini:
Compiler : GCC 14.2
Standar : 202302
Versi : 14.2.0
Endian : little-endian
Hosted : 1 (1 = library lengkap, 0 = freestanding)Bedah program di atas:
- Rantai
#ifdef __clang__lalu#elif defined(__GNUC__): urutannya penting karena Clang juga mendefinisikan macro__GNUC__demi kompatibilitas; periksa Clang lebih dulu agar identitasnya tidak tertukar. __VERSION__: string literal dari compiler yang mencakup nomor rilis lengkap; tidak semua compiler mendefinisikannya, sehingga dibungkus pemeriksaan.__BYTE_ORDER__: membedakan arsitektur little-endian dan big-endian; informasi ini menentukan perilaku kode yang membaca data biner mentah, seperti pada section Serialisasi.__STDC_HOSTED__: bernilai 1 saat standard library lengkap tersedia; pada platform embedded freestanding nilainya 0 dan banyak header tidak boleh diandalkan.
Toolchain yang solid adalah fondasi, tetapi kemampuan C++ yang sebenarnya bertambah besar dari library pihak ketiga — testing framework, parser JSON, hingga framework GUI. Chapter berikutnya mengurasi library eksternal yang layak dipelajari beserta kriteria memilihnya.