C Academy · Pelajaran

Penyusunan Bersyarat

ifdef dan makro

Pelajaran 1 daripada 413 langkah

Penyusunan Bersyarat ialah pelajaran C Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C Academy merangkumi sejumlah 4 pelajaran.

Prapemproses

Sebelum pengkompil melihat kod Anda, prapemproses akan dijalankan. Prapemproses mengendalikan setiap baris yang bermula dengan #: kemasukan, makro dan syarat.

Penyusunan bersyarat membolehkan Anda memasukkan atau mengecualikan blok kod berdasarkan syarat yang dinilai pada peringkat ini, lalu menghasilkan binaan yang berbeza daripada satu sumber.

Mentakrifkan Makro

#define mencipta makro. Tanpa nilai, makro itu hanyalah bendera yang boleh Anda uji kemudian.

Makro yang menyerupai objek menggantikan nama dengan teks; bendera hanya menandakan bahawa sesuatu telah ditetapkan.

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

ifdef dan ifndef

#ifdef NAME mengekalkan blok hanya jika NAME ditakrifkan. #ifndef mengekalkannya hanya jika NAME tidak ditakrifkan.

Di sini, cetakan nyahpepijat hanya wujud dalam binaan nyahpepijatan. Tanpa DEBUG ditakrifkan, pengkompil tidak pernah melihat baris itu.

#include <stdio.h>
#define DEBUG

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

if, elif, else

#if menilai ungkapan integer malar. Gabungkan dengan #elif dan #else untuk pemilihan berbilang laluan.

Ini memilih kod berdasarkan makro nombor 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 boleh menguji takrifan dengan defined(NAME), dan menggabungkan ujian dengan && serta ||.

Kaedah ini lebih fleksibel daripada #ifdef, yang hanya boleh menguji satu nama.

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

Mentakrifkan Semasa Penyusunan

Anda tidak perlu menetapkan makro secara keras. Bendera -D mentakrifkannya pada baris perintah.

Beginilah sistem binaan menukar ciri tanpa menyunting sumber. -DDEBUG sama seperti #define DEBUG pada bahagian atas setiap fail.

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

Pengesanan Platform

Pengkompil mentakrifkan terlebih dahulu makro yang menerangkan sasaran. Anda menggunakannya untuk menulis kod mudah alih.

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

Buat percabangan berdasarkan makro ini untuk memanggil API platform yang betul.

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

Pengawal Kemasukan Pengepala

Penggunaan klasik syarat ialah pengawal kemasukan, yang menghalang pengepala daripada diproses dua kali.

Kemasukan pertama mentakrifkan makro pengawal; kemasukan seterusnya melangkau isi kerana makro itu sudah ditakrifkan.

#ifndef UTILS_H
#define UTILS_H

int add(int a, int b);

#endif /* UTILS_H */

Menyahaktifkan Kod dengan Komen

#if 0 ... #endif menyahaktifkan satu blok dengan boleh dipercayai, termasuk blok yang sudah mengandungi komen.

Tidak seperti /* */, kaedah ini menyokong sarang dengan selamat, jadi inilah cara standard untuk mengecualikan kod buat sementara semasa nyahpepijatan.

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

Memeriksa Keluaran Prapemproses

Untuk melihat dengan tepat perkara yang akan disusun oleh pengkompil, jalankan prapemproses sahaja dengan -E.

Perintah ini mengembangkan semua kemasukan, makro dan syarat, yang amat berguna apabila makro tidak berfungsi seperti yang dijangka.

gcc -E app.c | less

Togol Ciri dalam Amalan

Corak yang biasa digunakan ialah satu pengepala konfigurasi yang menghidupkan atau mematikan ciri untuk seluruh projek.

Tukar satu #define dan setiap blok yang dilindungi merentas semua fail akan bertindak balas. Ini memastikan ciri pilihan terpisah dengan kemas daripada kod teras.

#include <stdio.h>
#define FEATURE_LOGGING 1

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

Semakan Pantas

Ramalkan tingkah laku takrifan baris perintah.

Ringkasan

Kini Anda boleh mengawal penyusunan bersyarat:

  • #ifdef/#ifndef menguji sama ada makro ditakrifkan
  • #if/#elif/#else menilai ungkapan malar, bersama defined()
  • -DNAME mentakrifkan makro daripada baris perintah untuk menukar ciri
  • Makro platform yang ditakrifkan terlebih dahulu membolehkan kod mudah alih; pengawal kemasukan menghalang kemasukan berganda

Seterusnya: menyusun kod merentas berbilang fail.

Percuma untuk bermula

Pelajari C dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
39
Pelajaran
144

Soalan Lazim

Adakah pelajaran “Penyusunan Bersyarat” percuma?

Ya — teks penuh “Penyusunan Bersyarat” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus C Academy, tingkat taraf kepada CoddyKit PRO. Kursus C Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penyusunan Bersyarat”?

ifdef dan makro Anda berlatih C Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Penyusunan Bersyarat” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Penyusunan Bersyarat
  2. Projek Berbilang Fail
  3. Makefiles
  4. Pustaka Statik dan Dikongsi
← Kembali ke C Academy