C90 adalah standar ISO pertama untuk bahasa C (1990), hasil adopsi verbatim dari ANSI C89 (1989). Standar inilah yang membuat kode C dapat dipindahkan antar compiler dan platform dengan jaminan perilaku yang konsisten—sebelum C90, setiap compiler punya dialeknya sendiri. C95 (Amendment 1, 1995) menambahkan dukungan wide character dan header seperti iso646.h, wchar.h, dan wctype.h agar C dapat memproses karakter non-ASCII. Bab ini menunjukkan gaya penulisan C89 yang ketat (hanya komentar /* */, deklarasi variabel di awal blok, prototipe fungsi eksplisit), lalu mendemonstrasikan fitur C95 lewat iso646.h. Kita akan memverifikasi setiap contoh dengan flag -std=c89 -pedantic agar yakin kode benar-benar patuh standar.

C89: Aturan Sintaks yang Belum Mengenal // dan Mixed Declaration #

Pada C89, compiler hanya menerima komentar blok /* ... */. Komentar satu baris // baru sah di C99. Selain itu, semua deklarasi variabel dalam sebuah blok harus muncul sebelum statement pertama—kita tidak bisa menulis printf(...); int y = 10;. Compiler modern seperti GCC menerima pelanggaran ini sebagai ekstensi (dengan warning), tetapi dengan -pedantic-errors pelanggaran tersebut menjadi error.

c
/* File: c90_1.c - Demo gaya C89: hanya komentar blok, deklarasi di awal */
#include <stdio.h>

/* Macro sederhana - satu-satunya cara konstanta compile-time di C89 */
#define MAX_BUF 32

/* Prototipe fungsi - di C89 harus ada */
int hitung_total(int *arr, int n);

int main(void) {
    int data[5];         /* deklarasi harus sebelum statement */
    int i;
    int total;

    for (i = 0; i < 5; ++i) {
        data[i] = (i + 1) * 10;
    }

    total = hitung_total(data, 5);
    printf("Total  : %d\n", total);
    printf("MAX_BUF: %d\n", MAX_BUF);
    return 0;
}

int hitung_total(int *arr, int n) {
    int i;               /* deklarasi HARUS di awal blok */
    int total = 0;
    for (i = 0; i < n; ++i) {
        total += arr[i];
    }
    return total;
}

Compile dan jalankan dengan flag -std=c89 -pedantic:

bash
gcc -std=c89 -Wall -Wextra -pedantic -o c90_1 c90_1.c
./c90_1

Output yang Dihasilkan:

text
Total  : 150
MAX_BUF: 32

Mari kita telaah baris-baris kode di atas:

  1. Baris 7 (int hitung_total(int *arr, int n);): Prototipe fungsi eksplisit. C89 memperkenalkan prototipe dengan tipe parameter lengkap; di gaya K&R, hanya nama parameter yang ditulis tanpa tipe. Tanpa prototipe, compiler tidak mengecek tipe argumen pemanggil, sehingga bug type-mismatch lolos.
  2. Baris 9-15 (int data[5]; int i; int total;): Tiga deklarasi diletakkan di awal main, sebelum statement for. Di C89, deklarasi setelah statement adalah syntax error. Compiler modern memberi warning -Wdeclaration-after-statement jika aturan ini dilanggar.
  3. Baris 18-20 (for (...)): Variabel i dideklarasikan terpisah; kita tidak bisa menulis for (int i = 0; ...). Bentuk for dengan deklarasi inline baru sah di C99.
  4. Baris 26-31 (int hitung_total(...)): Definisi fungsi dengan tanda tangan modern. Di C89 K&R style, definisi akan tampak seperti int hitung_total(arr, n) int *arr; int n; {...}. Bentuk modern lebih disarankan walaupun C89 masih menerima keduanya.
  5. Baris 28-29 (int i; int total = 0;): Deklarasi lokal di awal blok fungsi—sama seperti di main, harus sebelum statement apapun.

Demonstrasi Pelanggaran C89 yang Dideteksi GCC #

Mari kita tunjukkan dua pelanggaran C89 paling umum: komentar // dan deklarasi variabel di tengah blok. Kita akan melihat bagaimana GCC merespons masing-masing dengan -pedantic.

c
/* File: c90_bad.c - Berbagai pelanggaran gaya C89 */
#include <stdio.h>

int main(void) {
    int x = 5;
    // Komentar satu baris - ilegal di C89
    int y = 10;
    printf("%d\n", x + y);
    return 0;
}

Compile dengan flag ketat:

bash
gcc -std=c89 -Wall -Wextra -pedantic -o c90_bad c90_bad.c

Output yang Dihasilkan:

text
c90_bad.c: In function 'main':
c90_bad.c:4:5: error: C++ style comments are not allowed in ISO C90
    4 |     // Komentar satu baris - ilegal di C89
      |     ^
c90_bad.c:4:5: note: (this will be reported only once per input file)

Komentar // memicu error karena diperlakukan sebagai ekstensi C++. Tanpa -pedantic, GCC akan menerimanya. Sekarang mari kita lihat kasus mixed declaration (deklarasi setelah statement), yang pada GCC 14 dengan -std=c89 -pedantic menghasilkan warning alih-alih error:

c
/* File: c90_mixed.c - Deklarasi setelah statement ilegal di C89 */
#include <stdio.h>

int main(void) {
    printf("halo\n");
    int y = 10;  /* deklarasi setelah statement - ilegal di C89 */
    printf("%d\n", y);
    return 0;
}

Compile dan jalankan:

bash
gcc -std=c89 -Wall -Wextra -pedantic -o c90_mixed c90_mixed.c
./c90_mixed

Output yang Dihasilkan:

text
c90_mixed.c: In function 'main':
c90_mixed.c:4:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
    4 |     int y = 10;  /* deklarasi setelah statement - ilegal di C89 */
      |     ^~~
halo
10

Untuk mengubah warning ini menjadi error, gunakan -pedantic-errors. Inilah sebabnya flag -pedantic (atau lebih ketat: -pedantic-errors) wajib dipakai saat menulis kode yang harus benar-benar patuh C89.

C95: Amendment 1 dengan Wide Character dan Operator Alternatif #

C95 bukan standar penuh melainkan Amendment 1 (1995) untuk C90. C95 menambahkan tiga hal utama: header iso646.h (alias operator seperti and, or, not), header wchar.h dan wctype.h untuk pemrosesan karakter lebar, serta specifier konversi baru di printf/scanf untuk wide string (%ls, %lc). GCC mengaktifkan fitur C95 dengan flag -std=c90 ditambah fitur ISO C95 yang sudah default-on, atau dengan macro _ISOC95_SOURCE. Program berikut memakai iso646.h:

c
/* File: c95_1.c - Demo iso646.h dari C95 Amendment 1 */
#include <stdio.h>
#include <iso646.h>

int main(void) {
    int a = 1, b = 0;
    int x = 0xF0, y = 0x0F;

    /* and, or, not adalah alias untuk &&, ||, ! */
    if (a and not b) {
        printf("a BENAR dan b SALAH\n");
    }
    if (a or b) {
        printf("Salah satu benar\n");
    }

    /* bitand, bitor, xor untuk operasi bitwise */
    printf("x bitand y = 0x%02x\n", x bitand y);
    printf("x bitor  y = 0x%02x\n", x bitor  y);
    printf("x xor    y = 0x%02x\n", x xor    y);
    return 0;
}

Compile dan jalankan:

bash
gcc -std=c90 -Wall -Wextra -pedantic -o c95_1 c95_1.c
./c95_1

Output yang Dihasilkan:

text
a BENAR dan b SALAH
Salah satu benar
x bitand y = 0x00
x bitor  y = 0xff
x xor    y = 0xff

Header iso646.h sangat berguna untuk programmer yang keyboardnya tidak punya tombol &, |, ! (mis. layout keyboard JIS Jepang). Selain iso646.h, C95 juga menambahkan tipe wchar_t (sebelumnya hanya tersedia via stddef.h di beberapa compiler) dan fungsi wcslen, wcscmp, wprintf di wchar.h untuk bekerja dengan string karakter lebar—prasyarat untuk internasionalisasi aplikasi C modern.