0Pricing
C Academy · Pelajaran

Kompilasi Kondisional

ifdef dan makro.

Kompilasi Kondisional adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Prapemroses

Sebelum compiler melihat kode Anda, prapemroses dijalankan. Prapemroses menangani setiap baris yang diawali dengan #: include, makro, dan kondisional.

Kompilasi kondisional memungkinkan Anda menyertakan atau mengecualikan blok kode berdasarkan kondisi yang dievaluasi pada tahap ini, sehingga satu sumber dapat menghasilkan build yang berbeda.

Mendefinisikan Makro

#define membuat makro. Tanpa nilai, makro tersebut hanya menjadi penanda yang dapat Anda uji nanti.

Makro yang menyerupai objek mengganti nama dengan teks; penanda hanya menunjukkan bahwa sesuatu telah ditetapkan.

#define MAX_USERS 100   /* value macro */
#define DEBUG          /* flag macro */

ifdef dan ifndef

#ifdef NAME mempertahankan blok hanya jika NAME telah didefinisikan. #ifndef mempertahankannya hanya jika NAME belum didefinisikan.

Di sini, pencetakan debug hanya ada dalam build debug. Tanpa DEBUG yang didefinisikan, compiler bahkan tidak pernah melihat baris tersebut.

#include <stdio.h>
#define DEBUG

int main(void) {
#ifdef DEBUG
    printf("debug: starting\n");
#endif
    printf("running\n");
    return 0;
}

if, elif, else

#if mengevaluasi ekspresi bilangan bulat konstan. Gabungkan dengan #elif dan #else untuk pemilihan multijalur.

Ini memilih kode berdasarkan makro nomor versi.

#include <stdio.h>
#define VERSION 2

int main(void) {
#if VERSION >= 2
    printf("new feature on\n");
#else
    printf("legacy mode\n");
#endif
    return 0;
}

Operator defined

Di dalam #if, Anda dapat menguji apakah suatu definisi ada dengan defined(NAME), serta menggabungkan pengujian dengan && dan ||.

Ini lebih fleksibel daripada #ifdef, yang hanya dapat menguji satu nama.

#if defined(LINUX) && !defined(EMBEDDED)
    /* desktop Linux code */
#endif

Mendefinisikan Saat Kompilasi

Anda tidak harus menulis makro secara langsung di dalam kode. Flag -D mendefinisikannya melalui baris perintah.

Dengan cara inilah sistem build mengaktifkan atau menonaktifkan fitur tanpa mengubah sumber. -DDEBUG sama dengan menulis #define DEBUG di bagian atas setiap berkas.

gcc -DDEBUG -DVERSION=3 -o app app.c

Deteksi Platform

Compiler telah mendefinisikan sebelumnya makro yang menjelaskan target. Anda menggunakannya untuk menulis kode portabel.

  • _WIN32 — Windows (32 atau 64 bit)
  • __linux__ — Linux
  • __APPLE__ — macOS / iOS

Gunakan percabangan berdasarkan makro tersebut untuk memanggil API platform yang sesuai.

#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif

Penjaga Include Header

Penggunaan klasik kondisional adalah penjaga include, yang mencegah header diproses dua kali.

Include pertama mendefinisikan makro penjaga; include berikutnya melewati isi karena makro tersebut sudah didefinisikan.

#ifndef UTILS_H
#define UTILS_H

int add(int a, int b);

#endif /* UTILS_H */

Menonaktifkan Kode dengan Komentar

#if 0 ... #endif menonaktifkan sebuah blok secara andal, bahkan jika blok itu sudah berisi komentar.

Berbeda dari /* */, cara ini aman untuk komentar bertingkat, sehingga menjadi cara standar untuk mengecualikan kode sementara selama penelusuran bug.

#if 0
    legacy_function();   /* disabled for now */
    /* with internal comments too */
#endif

Memeriksa Keluaran Prapemroses

Untuk melihat secara tepat apa yang akan dikompilasi oleh compiler, jalankan hanya prapemroses dengan -E.

Perintah ini mengembangkan semua include, makro, dan kondisional, sehingga sangat berguna ketika makro tidak berperilaku sebagaimana mestinya.

gcc -E app.c | less

Penerapan Pengaktif Fitur

Pola yang umum adalah satu header konfigurasi yang mengaktifkan atau menonaktifkan fitur untuk seluruh proyek.

Ubah satu #define, lalu setiap blok yang dilindungi di semua berkas akan merespons. Cara ini memisahkan fitur opsional dari kode inti dengan rapi.

#include <stdio.h>
#define FEATURE_LOGGING 1

int main(void) {
#if FEATURE_LOGGING
    printf("logging enabled\n");
#endif
    printf("app ready\n");
    return 0;
}

Pemeriksaan Cepat

Prediksikan perilaku definisi pada baris perintah.

Ringkasan

Sekarang Anda dapat mengendalikan kompilasi kondisional:

  • #ifdef/#ifndef menguji apakah suatu makro telah didefinisikan
  • #if/#elif/#else mengevaluasi ekspresi konstan, bersama defined()
  • -DNAME mendefinisikan makro dari baris perintah untuk mengaktifkan atau menonaktifkan fitur
  • Makro platform yang telah ditentukan memungkinkan kode portabel; penjaga include mencegah penyertaan ganda

Berikutnya: mengatur kode di beberapa berkas.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kompilasi Kondisional” gratis?

Ya — teks lengkap “Kompilasi Kondisional” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Kompilasi Kondisional”?

ifdef dan makro. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Kompilasi Kondisional” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Kompilasi Kondisional
  2. Proyek Banyak File
  3. Makefile
  4. Pustaka Statis dan Bersama
← Kembali ke C Academy