Setiap perintah g++ sepanjang course ini selalu membawa flag -std=c++23, dan kini saatnya menjelaskan apa yang sebenarnya dilakukan flag itu. Bahasa C++ terbit dalam edisi standar setiap tiga tahun — C++17, C++20, C++23 — dan compiler hanya mengaktifkan fitur edisi tertentu bila diminta. Flag -std itulah saklar pemilih edisinya, dan pilihannya menentukan fitur apa saja yang boleh kita pakai sekaligus seberapa portabel kode kita di berbagai toolchain. Pada Chapter ini kita membuktikan pengaruhnya dengan demonstrasi nyata: kode C++23 yang ditolak di mode C++17, perbedaan mode ISO dengan mode GNU, dan ditutup rekomendasi praktis untuk proyek Anda.
Apa yang Dilakukan Flag -std #
Flag -std memilih edisi standar yang dipakai compiler untuk membaca kode kita: -std=c++17, -std=c++20, atau -std=c++23. Dua hal berubah seketika: fitur bahasa yang dikenali (misalnya std::print hanya dikenal di C++23) dan nilai makro __cplusplus, yang berfungsi seperti label versi yang bisa dibaca kode itu sendiri. Tanpa flag apa pun, GCC 14 memakai mode gnu++17 — jangan kaget bila program tanpa -std melapor versi yang berbeda dari ekspektasi Anda:
g++ cek-default.cpp -o cek-default
./cek-default__cplusplus = 201703(Program cek-default.cpp di atas hanya mencetak __cplusplus lewat std::cout.) Nilai 201703 adalah label C++17 — GCC 14 memang belum menjadikan C++23 mode bawaannya, jadi fitur-fitur baru hanya aktif kalau kita memintanya secara eksplisit. Kebiasaan menulis flag -std di setiap perintah kompilasi — seperti yang dipraktikkan course ini — memastikan hasilnya identik di mesin siapa pun, karena edisi yang sama dipilih secara sadar, bukan terserah versi default compiler.
Demo: Kode C++23 Menolak di Mode C++17 #
Bukti paling jelas tentang fungsi flag ini adalah program yang memakai fitur C++23 lalu dikompilasi dua kali dengan edisi berbeda. Program berikut memakai std::println dari header <print> — fitur C++23 yang mencetak teks lengkap dengan baris baru tanpa escape manual:
#include <print>
int main() {
std::println("Fitur C++23: std::println tanpa escape manual");
std::println("__cplusplus = {}", __cplusplus);
return 0;
}Output yang Dihasilkan:
Fitur C++23: std::println tanpa escape manual
__cplusplus = 202302Dengan -std=c++23, program di atas dikompilasi mulus dan output-nya seperti di atas. Sekarang kompilasi file yang sama persis dengan -std=c++17 — compiler menolaknya dengan dua error (output nyata dari lingkungan praktikum):
g++ -std=c++17 standar23.cpp -o standar17standar23.cpp: In function ‘int main()’:
standar23.cpp:4:10: error: ‘println’ is not a member of ‘std’
4 | std::println("Fitur C++23: std::println tanpa escape manual");
| ^~~~~~~
standar23.cpp:5:10: error: ‘println’ is not a member of ‘std’
5 | std::println("__cplusplus = {}", __cplusplus);
| ^~~~~~~Pesan ‘println’ is not a member of ‘std’ sering membingungkan pemula karena kode-nya memang benar menurut C++23 — dan justru itu intinya: error tersebut bukan berarti kode salah, melainkan edisi bahasa yang dipilih belum menyediakan fitur itu. Kode dan compiler tidak berubah; hanya flag -std-nya. Kapan pun Anda menjumpai error “not a member” pada kode yang Anda yakini valid, periksa flag -std sebelum mencurigai kode Anda sendiri.
Mode ISO vs Mode GNU: c++23 vs gnu++23 #
Selain edisi tahun, flag -std juga punya dua varian per edisi: -std=c++23 (mode ISO ketat) dan -std=gnu++23 (mode GNU, bawaan GCC). Mode GNU menyertakan ekstensi bahasa milik GCC yang tidak ada di standar, sedangkan mode ISO mematikannya agar kode hanya mengandalkan fitur standar. Program kecil ini bisa mendeteksi mode yang sedang aktif lewat makro __STRICT_ANSI__, yang hanya didefinisikan pada mode ketat:
#include <iostream>
int main() {
#ifdef __STRICT_ANSI__
std::cout << "Mode ISO ketat: ekstensi GNU dimatikan\n";
#else
std::cout << "Mode GNU: ekstensi GNU aktif\n";
#endif
return 0;
}Output yang Dihasilkan:
Mode ISO ketat: ekstensi GNU dimatikanKompilasi ulang file yang sama dengan -std=gnu++23 dan hasilnya berubah:
g++ -std=gnu++23 mode-gnu.cpp -o mode-gnu
./mode-gnuMode GNU: ekstensi GNU aktifApa wujud nyata ekstensi GNU itu? Contoh klasiknya kata kunci typeof, yang mengambil tipe sebuah ekspresi — fitur praktis yang tidak ada di standar (padanannya decltype dengan semantik sedikit berbeda). Program berikut memakainya:
#include <iostream>
int main() {
int angka = 42;
typeof(angka) salinan = angka + 8;
std::cout << salinan << "\n";
return 0;
}Di mode GNU program itu sah dan mencetak 50; di mode ISO ketat compiler menolaknya — output nyata berikut:
cek-typeof.cpp: In function ‘int main()’:
cek-typeof.cpp:5:5: error: ‘typeof’ was not declared in this scope; did you mean ‘typedef’?
5 | typeof(angka) salinan = angka + 8;
| ^~~~~~
| typedef
cek-typeof.cpp:6:18: error: ‘salinan’ was not declared in this scope
6 | std::cout << salinan << "\n";
| ^~~~~~~Demo ini menjelaskan mengapa course ini selalu memakai -std=c++23, bukan gnu++23: kode yang lolos mode ISO ketat dijamin tidak bergantung pada ekstensi satu compiler, sehingga pindah ke Clang atau MSVC tidak mengejutkan. Perilaku flag per edisi didokumentasikan resmi di C++ Dialect Options GCC
.
Kompatibilitas dengan Kode Lama #
Memilih edisi lebih baru bukan upgrade tanpa risiko: setiap edisi standar sesekali menghapus fitur yang sudah lama ditinggalkan. Contoh yang pernah mengguncang banyak proyek adalah C++17 yang menghapus std::auto_ptr dan std::bind1st — kode lama yang masih memakainya menolak dikompilasi di mode C++17 dan harus di-update atau tetap dikompilasi dengan edisi lama (-std=c++14) sementara migrasinya berjalan. Karena itu, untuk kode warisan (legacy code) yang sudah berjalan, edisi standarnya ikut terkunci bersama kodenya: ganti edisi hanya setelah kode-nya dibersihkan. Sebaliknya, edisi lama tidak pernah menolak fitur baru yang tidak dipakai — kode C++17 murni tetap dikompilasi di flag C++23 tanpa masalah, karena standar dirancang backward compatible untuk kode yang sah.
Rekomendasi Praktis #
Dari semua pembahasan di atas, berikut panduan yang bisa langsung dipraktikkan:
- Proyek baru: mulai dari
-std=c++20bila toolchain tim Anda masih campuran, atau-std=c++23bila semua compiler sudah mendukung (GCC 14, Clang 18, MSVC VS 2022 terkini). Fitur C++20 sepertiranges,std::span, danstd::formatsudah memberi keuntungan besar sehari-hari. - Belajar C++ di course ini: ikuti
-std=c++23seperti contoh course, agar fitur modern terbiasa di tangan sejak awal dan tidak perlu mengubah kebiasaan nanti. - Kode warisan: biarkan edisi lamanya sampai migrasi terencana; jangan menaikkan flag
-stddi tengah perbaikan kecil. - Dukungan fitur per compiler: sebelum mengandalkan satu fitur baru untuk proyek lintas compiler, cek tabel Compiler Support cppreference — tabel itu mencatat fitur demi fitur, edisi demi edisi, untuk GCC, Clang, dan MSVC.
Dengan flag -std ini, rangkaian persiapan lingkungan Anda tuntas: compiler terpasang, IDE terpilih, perintah kompilasi dikuasai, empat tahap build dipahami, dan edisi bahasa sudah dikunci. Pada Section berikutnya — Dasar Pemrograman — kita akhirnya berhenti membangun alat dan mulai memakainya: menulis program-program C++ pertama yang sesungguhnya, dari main() sampai loop dan input pengguna.