Pustaka standar C masih menyimpan beberapa header yang belum tersentuh jalur ini, dan semuanya melayani kebutuhan yang lebih terspesialisasi daripada I/O maupun memori. Topik ini memberi gambaran singkat tentang wchar.h, locale.h, fenv.h, complex.h, threads.h, dan stdatomic.h, dengan tujuan agar keberadaan serta kegunaan masing-masing diketahui, bukan agar seluruh isinya dikuasai. Apabila suatu saat program membutuhkan teks Unicode, angka kompleks, atau perhitungan pecahan yang ketat, sumber rujukannya sudah terpetakan di sini.
wchar.h: teks lebar#
Header wchar.h menangani teks lebar (wide string), yaitu rangkaian karakter bertipe wchar_t yang tiap elemennya cukup lebar untuk menampung satu karakter dari berbagai aksara. Fungsi-fungsinya mengikuti pola string.h yang sudah dikenal, misalnya wcslen untuk panjang, wcscpy untuk salin, dan wcscmp untuk banding, sehingga keterampilan pada string biasa dapat dipindahkan dengan mengganti awalan str menjadi wcs:
// tidak-dijalankan
wchar_t judul[64] = L"Catatan";
size_t panjang = wcslen(judul); /* panjang dalam jumlah karakter lebar */Tipe wchar_t tidak seragam antarplatform, yaitu berukuran 4 byte pada Linux dan 2 byte pada Windows, sehingga berkas teks lebar yang ditulis di satu platform tidak serta-merta dibaca di platform lain. Untuk konversi antara teks multibyte biasa dan teks lebar, header ini menyediakan keluarga fungsi mbrtowc dan wcrtomb yang bekerja per karakter dan menyimpan keadaan konversinya. Pemakaian nyatanya muncul pada program yang memproses aksara non-Latin atau antarmuka grafis yang menerima Unicode. Kelengkapan dukungan aksara juga melibatkan fungsi klasifikasi versi lebar pada wctype.h, misalnya iswalpha, yang bekerja pada wchar_t sebagaimana isalpha bekerja pada char. Header wchar.h dan wctype.h hampir selalu berpasangan pada program yang memproses teks internasional secara menyeluruh, dan keduanya memakai tipe penampung keadaan mbstate_t yang sama untuk konversinya.
locale.h: penyesuaian wilayah#
Header locale.h mengatur penyesuaian wilayah (locale), yaitu sekumpulan aturan yang menentukan format angka, mata uang, tanggal, dan urutan huruf menurut kebiasaan sebuah wilayah. Fungsi setlocale mengaktifkan locale tertentu, dengan kategori seperti LC_ALL untuk semuanya, LC_NUMERIC untuk pemisah desimal, dan LC_TIME untuk nama hari serta bulan. Program C memulai eksekusinya pada locale baku bernama C, yang memakai titik sebagai pemisah desimal dan nama hari berbahasa Inggris:
// tidak-dijalankan
#include <locale.h>
setlocale(LC_ALL, ""); /* pakai locale yang diatur lingkungan pengguna */Pemanggilan di atas membuat printf mencetak koma sebagai pemisah desimal dan strftime mencetak nama bulan dalam bahasa setempat, tergantung lingkungan tempat program berjalan. Konsekuensinya penting diperhatikan, yaitu program yang mengaktifkan locale pengguna menjadi tidak deterministik pada keluarannya, karena hasilnya bergantung pada mesin tempat program dieksekusi. Contoh sepanjang jalur ini sengaja membiarkan locale baku C agar keluarannya dapat diverifikasi, dan setlocale baru dipakai ketika program memang dirancang untuk pengguna dari berbagai wilayah. Kategori lain yang perlu diketahui adalah LC_COLLATE untuk urutan huruf saat pengurutan dan LC_CTYPE untuk klasifikasi karakter, karena keduanya memengaruhi perilaku fungsi tertentu secara diam-diam. Program yang datanya akan disimpan atau dibandingkan lintas wilayah tidak boleh membiarkan pilihan locale mengikuti lingkungan tanpa disadari, karena urutan huruf yang berbeda membuat data tidak konsisten.
fenv.h: lingkungan pecahan#
Header fenv.h memberi akses ke lingkungan pecahan (floating-point environment), yaitu mekanisme di tingkat perangkat keras yang mengatur pembulatan dan menandai kejadian luar biasa pada perhitungan pecahan. Alih-alih hanya mengembalikan NaN, operasi seperti pembagian nol menaikkan bendera (flag) FE_DIVBYZERO, dan bendera itu bersifat lengket, artinya tetap menyala sampai dibersihkan secara eksplisit dengan feclearexcept. Fungsi fetestexcept memeriksa bendera, sedangkan fesetround mengubah mode pembulatan:
#include <fenv.h>
#include <stdio.h>
int main(void)
{
double pembagi = 0.0;
feclearexcept(FE_ALL_EXCEPT);
double hasil = 1.0 / pembagi;
if (fetestexcept(FE_DIVBYZERO)) {
printf("Flag FE_DIVBYZERO terdeteksi.\n");
}
printf("hasil = %f\n", hasil);
return 0;
}Flag FE_DIVBYZERO terdeteksi.
hasil = infPembagian nol tidak menghentikan program, melainkan menghasilkan nilai tak hingga (infinity) dan menaikkan benderanya, yang kemudian diperiksa setelah perhitungan selesai. Bendera FE_OVERFLOW dan FE_UNDERFLOW melengkapi FE_DIVBYZERO untuk menangkap hasil yang terlalu besar atau terlalu kecil, sedangkan FE_INVALID menandai operasi yang tidak bermakna seperti akar kuadrat bilangan negatif. Pendekatan pemeriksaan berkala ini cocok untuk komputasi numerik yang menjalankan jutaan operasi sebelum memeriksa ada tidaknya kejanggalan, karena memeriksa errno pada setiap operasi jauh lebih mahal. Dukungan fenv.h bergantung pada makro uji fitur, dan pada platform tanpa lingkungan pecahan penuh, sebagian fungsinya mungkin tidak tersedia.
complex.h: aritmetika kompleks#
Header complex.h menyediakan tipe bilangan kompleks, misalnya double complex untuk bilangan dengan bagian nyata dan imajiner bertipe double, beserta konstanta I yang menyatakan akar kuadrat dari minus satu. Aritmetikanya ditulis sebagaimana bilangan biasa, sedangkan fungsi pendampingnya mengambil bagian penyusunnya, yaitu creal untuk bagian nyata, cimag untuk bagian imajiner, dan cabs untuk besaran modulusnya:
#include <complex.h>
#include <stdio.h>
int main(void)
{
double complex z = 3.0 + 4.0 * I;
double complex w = 1.0 + 2.0 * I;
double complex hasil = z * w;
printf("z = %.1f + %.1fi\n", creal(z), cimag(z));
printf("|z| = %.1f\n", cabs(z));
printf("z * w = %.1f + %.1fi\n", creal(hasil), cimag(hasil));
return 0;
}z = 3.0 + 4.0i
|z| = 5.0
z * w = -5.0 + 10.0iPerkalian pada contoh mengikuti aturan aljabar kompleks, yaitu bagian nyata -5 dan bagian imajiner 10, persis seperti perhitungan manual. Untuk presisi lain, header ini menyediakan float complex dan long complex, sehingga pilihan presisinya mengikuti kebutuhan perhitungan. Penentu printf tidak mempunyai format khusus untuk bilangan kompleks, sehingga bagian nyata dan imajinernya dicetak terpisah lewat creal dan cimag sebagaimana contoh di atas. Fungsi matematika juga tersedia dalam versi kompleks dengan awalan c, seperti cexp, csqrt, dan csin, sehingga transformasi yang lazim pada pengolahan sinyal dapat ditulis ringkas. Header ini dipakai pada bidang teknik dan sains, sedangkan program umum jarang membutuhkannya.
threads.h dan stdatomic.h: konkurensi#
Kedua header ini membawa dukungan konkurensi (concurrency) ke dalam pustaka standar sejak C11, dan keduanya bersifat opsional sehingga platform bebas menyediakannya atau tidak. Header threads.h meminjam bentuk pustaka pthreads, yaitu thrd_create untuk memulai aliran eksekusi baru, thrd_join untuk menunggu aliran itu selesai, serta mtx_lock dan cnd_wait untuk penguncian serta penantian bersama. Header stdatomic.h menyediakan tipe atomik seperti atomic_int beserta operasinya seperti atomic_fetch_add, yang menjamin baca-tulis tidak terpecah di tengah operasi meskipun dilakukan beberapa aliran sekaligus:
// tidak-dijalankan
#include <stdatomic.h>
atomic_int selesai = 0;
atomic_fetch_add(&selesai, 1); /* bertambah dengan aman dari banyak aliran */Pemrograman bersamaan merupakan disiplin tersendiri, mulai dari balapan data (data race) hingga urutan memori (memory ordering), sehingga cukup dipahami dulu bahwa pustaka standar menyediakan alatnya secara resmi. Penguncian pada mtx_lock melindungi bagian kode yang tidak boleh dijalankan dua aliran sekaligus, sedangkan tipe atomik lebih ringan untuk operasi tunggal seperti penghitung bersama, dan keduanya saling melengkapi sesuai frekuensi aksesnya. Di lingkungan tanpa dukungannya, makro uji fitur seperti STDC_NO_THREADS terdefinisi, dan keberadaannya dapat dipakai untuk menonaktifkan kode konkuren secara bersyarat. Pada Linux modern dengan glibc terbaru, kedua header tersebut tersedia dan siap dipakai.
Ringkasan#
- wchar.h memproses teks lebar bertipe wchar_t dengan fungsi bawaian string.h, ditambah keluarga konversi multibyte, meskipun lebar wchar_t berbeda antarplatform.
- locale.h mengaktifkan aturan wilayah lewat setlocale dan berpengaruh pada format angka serta tanggal, dengan risiko keluaran menjadi bergantung lingkungan.
- fenv.h membaca dan membersihkan bendera perhitungan pecahan seperti FE_DIVBYZERO, dan benderanya bersifat lengket sampai dibersihkan.
- complex.h menghadirkan tipe double complex beserta fungsi creal, cimag, dan cabs untuk perhitungan bilangan kompleks.
- threads.h dan stdatomic.h menyediakan aliran eksekusi, kunci, serta tipe atomik sejak C11, dan keduanya bersifat opsional dengan makro uji fiturnya.
Referensi#
- fenv(3) — Linux man-pages project — Dokumentasi lingkungan pecahan beserta bendera dan mode pembulatannya.
- setlocale(3) — Linux man-pages project — Kategori locale dan pengaruhnya pada fungsi pustaka standar.
- Complex number arithmetic — cppreference.com — Daftar lengkap tipe dan fungsi aritmetika kompleks pada complex.h.
- Concurrency support library — cppreference.com — Ikhtisar threads.h dan stdatomic.h beserta halaman detail setiap fungsinya.