Setiap program C yang dapat dieksekusi harus memiliki tepat satu fungsi main. Sistem operasi menggunakan fungsi ini sebagai titik masuk (entry point): ketika pengguna menjalankan berkas executable, runtime sistem operasi memanggil fungsi main dan kode di dalam tubuh main pun dieksekusi. Pada Chapter ini kita akan mempelajari dua signature standar fungsi main, arti nilai yang dikembalikan, serta cara menerima argumen dari command line.
Signature Dasar main tanpa Parameter #
Bentuk paling sederhana dari main tidak menerima parameter apa pun. Kita menuliskan kata kunci void di dalam tanda kurung untuk menyatakan secara eksplisit bahwa fungsi main tidak menerima argumen. Nilai yang dikembalikan bertipe int dan secara konvensi bernilai 0 ketika program berakhir sukses.
#include <stdio.h>
int main(void) {
printf("Mulai\n");
printf("Selesai\n");
return 0;
}Output yang Dihasilkan:
Mulai
SelesaiMari kita telaah baris-baris kode di atas:
- Baris 3 (
int main(void)): mendefinisikan fungsimainyang tidak menerima parameter dan mengembalikan nilai bertipeint. - Baris 4-5 (
printf(...)): dua statement yang mencetak teks ke layar secara berurutan. Compiler mengeksekusi statement satu per satu dari atas ke bawah. - Baris 6 (
return 0;): mengembalikan nilai0ke sistem operasi. Nilai0adalah kode konvensional yang berarti “program berakhir tanpa error”.
Kode keluaran 0 dapat dilihat di terminal dengan membaca variabel $? pada shell Bash. Pada contoh di atas, exit code adalah 0, sesuai nilai yang dikembalikan return.
Menerima Argumen Command Line #
Bentuk kedua main menerima dua parameter yang membuat program dapat membaca argumen yang dilewatkan pengguna dari command line. Parameter argc berisi jumlah argumen (termasuk nama program itu sendiri), sedangkan argv adalah array berisi string argumen tersebut.
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Jumlah argumen: %d\n", argc);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}Output yang Dihasilkan (dijalankan dengan ./program halo dunia):
Jumlah argumen: 3
argv[0] = ./program
argv[1] = halo
argv[2] = duniaMari kita telaah baris-baris kode di atas:
- Baris 3 (
int main(int argc, char *argv[])): signaturemainyang menerima argumen command line.argcbertipeintdan menyimpan jumlah argumen;argvbertipechar *argv[](array of string) dan menyimpan nilai setiap argumen. - Baris 4 (
printf("Jumlah argumen: %d\n", argc)): mencetak nilaiargc. Format%ddipakai untuk mencetak bilangan bertipeint. - Baris 5-7 (
forloop): melakukan iterasi darii = 0hinggai < argc, lalu mencetak setiap elemenargv[i]menggunakan format%suntuk string. - Baris 8 (
return 0;): program berakhir dengan kode sukses0.
Perhatikan bahwa argv[0] selalu berisi nama program itu sendiri. Karena itu, jumlah argumen yang diberikan pengguna sebenarnya adalah argc - 1. Pada contoh di atas, pengguna mengetik ./program halo dunia sehingga argc bernilai 3 (nama program + dua argumen).
Mengembalikan Kode Error ke Sistem Operasi #
Nilai yang dikembalikan main tidak hanya formalitas; nilai tersebut menjadi exit code yang dapat diperiksa oleh shell atau program lain yang memanggil program kita. Konvensi yang banyak diadopsi adalah: 0 berarti sukses, sedangkan nilai 1 hingga 255 menandakan kondisi error tertentu.
#include <stdio.h>
int main(void) {
int umur = 25;
if (umur < 17) {
printf("Anak-anak\n");
return 1;
}
printf("Dewasa\n");
return 0;
}Output yang Dihasilkan:
DewasaPada contoh di atas, karena umur bernilai 25 (lebih besar dari 17), blok if tidak dieksekusi dan program mencapai return 0. Bila kita mengubah umur menjadi 10, program akan mencetak Anak-anak dan mengembalikan kode 1 — sebuah sinyal ke sistem operasi bahwa program berakhir dengan kondisi tidak normal.
Ringkasan Signature main #
Dua signature standar main yang dijamin oleh standar C adalah:
int main(void)— tanpa argumen command line.int main(int argc, char *argv[])— menerima argumen command line.
Variasi lain seperti void main(void) atau int main(int argc, char **argv, char *envp[]) memang diizinkan oleh beberapa compiler, tetapi tidak portabel lintas platform. Agar kode tetap dapat di-compile di GCC, Clang, dan MSVC tanpa kejutan, kita sebaiknya selalu memakai salah satu dari dua signature standar di atas.