Ketika kita menulis kode C++, kita sebenarnya menulis untuk dua pembaca sekaligus: compiler hari ini dan standar internasional yang mengikat semua compiler. Kata “C++” bukan menunjuk satu produk milik satu perusahaan, melainkan sebuah spesifikasi resmi bernomor yang bisa diimplementasikan siapa pun. Pemahaman ini menjelaskan banyak hal praktis: mengapa fitur baru belum tersedia di compiler kita, mengapa kode berpindah platform, dan bagaimana menulis kode yang menyesuaikan diri. Pada Chapter ini kita mengenal dokumen standar, komite yang menyusunnya, siklus rilisnya, dan cara mendeteksi fitur lewat feature test macro yang benar-benar kita jalankan.
Apa itu ISO/IEC 14882 #
Dokumen resmi C++ diterbitkan oleh ISO dengan nomor ISO/IEC 14882. Edisi yang sudah terbit antara lain 14882:1998 (C++98), 14882:2011 (C++11), 14882:2017 (C++17), dan 14882:2024 yang memuat isi C++23 dan terbit pada Oktober 2024. Di dalamnya, standar mendefinisikan sintaks bahasa, semantik setiap konstruksi — termasuk perilaku apa yang dianggap undefined behavior — serta spesifikasi penuh pustaka standar. Compiler yang patuh disebut conforming implementation: ia boleh menambah ekstensi sendiri, tetapi kode yang mengikuti standar harus tetap berperilaku sama di compiler mana pun. Sifat vendor-neutral inilah alasan kode C++ tetap portabel dari superkomputer hingga microcontroller.
Peran WG21 dan Siklus Tiga Tahunan #
Standar itu disusun oleh kelompok kerja ISO bernama WG21 (formalnya JTC 1/SC 22/WG 21), yang menghimpun delegasi negara, perwakilan vendor compiler besar, dan akademisi. Siapa pun bisa mengajukan proposal berbentuk paper; paper dibahas, direvisi, dan diuji di rapat rutin sebelum disetujui masuk ke working draft — draf tunggal yang terus diperbarui. Ketika sebuah draft dianggap matang, ia dikirim sebagai DIS (Draft International Standard) untuk pemungutan suara, lalu diterbitkan ISO. Sejak C++11, proses ini berjalan dalam siklus tetap tiga tahunan: C++11, C++14, C++17, C++20, C++23, dan berikutnya C++26. Status perkembangan standar terkini selalu bisa dipantau di halaman status isocpp.org .
Standar vs Implementasi Compiler #
Standar adalah kontrak tertulis; compiler adalah pihak yang mengimplementasikannya — dan di sinilah perbedaan muncul. Implementasi tertentu bisa tertinggal pada fitur baru, atau justru menyediakan ekstensi non-standar seperti ekstensi GNU yang hanya jalan di GCC. Kita memilih perilaku compiler lewat flag -std=c++17 atau -std=c++23 (dibahas lanjut pada Chapter Memilih Standar C++). Karena dukungan per fitur berbeda-beda, halaman compiler support cppreference
menjadi rujukan de facto untuk mengecek fitur mana yang sudah tersedia di compiler dan versi tertentu. Prinsipnya sederhana: standar menjamin apa yang benar, implementasi menentukan kapan itu tersedia.
Feature Test Macro: Mendeteksi Fitur #
Bagaimana sebuah kode mengetahui apakah fitur tertentu tersedia di implementasi yang menjalankannya? Jawabannya feature test macro: makro preprocessor yang didefinisikan pustaka standar atau compiler ketika sebuah fitur tersedia. Makro pustaka berawalan __cpp_lib_ dan dideklarasikan di header <version>, sedangkan makro fitur bahasa memakai pola __cpp_ tanpa lib. Nilai makronya berupa angka yyyymm yang menunjukkan tahun dan bulan paper fitur tersebut disetujui. Dengan #ifdef, kode kita bisa memakai fitur baru bila ada dan mundur ke jalur lama bila tidak — teknik wajib untuk pustaka lintas compiler.
Praktik: Membaca Makro Fitur #
Program berikut memeriksa tiga makro pustaka: __cpp_lib_print dan __cpp_lib_expected (fitur C++23), serta __cpp_lib_format (fitur C++20). Konsep #ifdef adalah directive preprocessor — kita bahas mekanismenya pada Chapter Struktur Program C++; untuk sekarang cukup pahami ia memilih baris mana yang ikut dikompilasi.
#include <iostream>
#include <version> // header khusus yang berisi makro feature test
int main() {
#ifdef __cpp_lib_print
std::cout << "std::print tersedia (level " << __cpp_lib_print << ")\n";
#else
std::cout << "std::print tidak tersedia di implementasi ini\n";
#endif
#ifdef __cpp_lib_expected
std::cout << "std::expected tersedia (level " << __cpp_lib_expected << ")\n";
#else
std::cout << "std::expected tidak tersedia di implementasi ini\n";
#endif
#ifdef __cpp_lib_format
std::cout << "std::format tersedia (level " << __cpp_lib_format << ")\n";
#else
std::cout << "std::format tidak tersedia di implementasi ini\n";
#endif
return 0;
}Pertama, kita kompilasi dengan standar C++23 pada GCC 14.2:
Output yang Dihasilkan:
std::print tersedia (level 202211)
std::expected tersedia (level 202211)
std::format tersedia (level 202110)Sekarang file yang sama persis, tanpa diubah satu karakter, kita kompilasi dengan standar C++20:
Output yang Dihasilkan:
std::print tidak tersedia di implementasi ini
std::expected tidak tersedia di implementasi ini
std::format tersedia (level 202110)Bedah hasil di atas memperlihatkan seluruh konsep chapter ini bekerja bersama:
- Baris 2 (
#include <version>): header ini menarik semua makro feature test pustaka ke dalam program. - Baris 5 (
#ifdef __cpp_lib_print): preprocessor memeriksa apakah makro itu didefinisikan; bila ya, blok pertama yang dikompilasi, bila tidak blok#else. - Level
202211: berarti paper fiturstd::printdanstd::expecteddisetujui pada November 2022; angka ini naik bila ada revisi lanjutan. - Perbedaan dua output: satu file, dua flag
-std— pada C++20 makro__cpp_lib_printdan__cpp_lib_expectedtidak didefinisikan, sehingga jalur#elseyang masuk ke program. std::formattetap tersedia: fitur itu memang milik C++20, sehingga makro202110(Oktober 2021) muncul di kedua mode.
Perhatikan bahwa program tidak pernah “gagal” ketika fitur tidak ada — ia mendeteksi dan menyesuaikan diri, persis seperti pustaka production menjaga kompatibilitas lintas compiler. Dokumentasi lengkap seluruh makro tersedia di halaman feature testing cppreference .
Setelah paham kontrak tertulis yang mengikat semua compiler, langkah logisnya adalah mengenal para pelaksananya. Chapter berikutnya membahas compiler dan toolchain: GCC, Clang, MSVC, serta alur empat tahap yang mengubah file .cpp menjadi program yang berjalan.