Koşullu Derleme
ifdef ve makrolar
Koşullu Derleme, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Ön İşleyici
Derleyici kodunuzu görmeden önce ön işleyici çalışır. # ile başlayan her satırı işler: eklemeleri, makroları ve koşulluları.
Koşullu derleme, bu aşamada değerlendirilen koşullara göre kod bloklarını eklemenize veya dışarıda bırakmanıza ve tek bir kaynaktan farklı derlemeler üretmenize olanak tanır.
Makro Tanımlama
#define bir makro oluşturur. Değer verilmezse yalnızca daha sonra sınayabileceğiniz bir bayraktır.
Nesne benzeri makrolar bir adı metinle değiştirir; bayraklar ise yalnızca bir şeyin ayarlandığını belirtir.
#define MAX_USERS 100 /* value macro */
#define DEBUG /* flag macro */ifdef ve ifndef
#ifdef NAME, bloğu yalnızca NAME tanımlıysa korur. #ifndef ise yalnızca NAME tanımlı değilse korur.
Burada hata ayıklama çıktısı yalnızca hata ayıklama derlemelerinde bulunur. DEBUG tanımlı değilse derleyici bu satırı hiç görmez.
#include <stdio.h>
#define DEBUG
int main(void) {
#ifdef DEBUG
printf("debug: starting\n");
#endif
printf("running\n");
return 0;
}if, elif, else
#if, sabit bir tamsayı ifadesini değerlendirir. Çok yönlü seçim için bunu #elif ve #else ile birleştirin.
Bu yapı, kodu bir sürüm numarası makrosuna göre seçer.
#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;
}defined İşleci
#if içinde defined(NAME) ile tanımlamayı sınayabilir, sınamaları && ve || ile birleştirebilirsiniz.
Bu, yalnızca tek bir adı sınayabilen #ifdef'den daha esnektir.
#if defined(LINUX) && !defined(EMBEDDED)
/* desktop Linux code */
#endifDerleme Zamanında Tanımlama
Makroları sabit olarak kod içine yazmanız gerekmez. -D bayrağı onları komut satırında tanımlar.
Derleme sistemleri, kaynak kodu düzenlemeden özellikleri bu şekilde değiştirir. -DDEBUG, her dosyanın başındaki #define DEBUG ile aynıdır.
gcc -DDEBUG -DVERSION=3 -o app app.cPlatform Algılama
Derleyiciler hedefi açıklayan makroları önceden tanımlar. Taşınabilir kod yazmak için bunları kullanırsınız.
_WIN32— Windows (32 veya 64 bit)__linux__— Linux__APPLE__— macOS / iOS
Doğru platform API'sini çağırmak için bu makrolara göre dallanma yapın.
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endifBaşlık Ekleme Koruyucuları
Koşulluların klasik kullanım alanı, bir başlığın iki kez işlenmesini engelleyen ekleme koruyucusudur.
İlk ekleme koruyucu makroyu tanımlar; sonraki eklemeler, makro zaten tanımlı olduğu için gövdeyi atlar.
#ifndef UTILS_H
#define UTILS_H
int add(int a, int b);
#endif /* UTILS_H */Kodu Yorum Dışı Bırakma
#if 0 ... #endif, içinde zaten yorumlar bulunan bir blok da olsa onu güvenilir biçimde devre dışı bırakır.
/* */ ifadesinin aksine güvenle iç içe kullanılabilir; bu nedenle hata ayıklama sırasında kodu geçici olarak dışarıda bırakmanın standart yoludur.
#if 0
legacy_function(); /* disabled for now */
/* with internal comments too */
#endifÖn İşleyici Çıktısını İnceleme
Derleyicinin tam olarak neyi derleyeceğini görmek için yalnızca ön işleyiciyi -E ile çalıştırın.
Bu işlem tüm eklemeleri, makroları ve koşulluları genişletir; bir makro beklenmedik davrandığında son derece değerlidir.
gcc -E app.c | lessÖzellik Açma-Kapamaları Uygulamada
Yaygın bir yaklaşım, tüm proje için özellikleri açıp kapatan tek bir yapılandırma başlığı kullanmaktır.
Bir #define ifadesini değiştirin; tüm dosyalardaki korumalı bloklar buna göre tepki verir. Bu, isteğe bağlı özellikleri temel koddan temiz biçimde ayrı tutar.
#include <stdio.h>
#define FEATURE_LOGGING 1
int main(void) {
#if FEATURE_LOGGING
printf("logging enabled\n");
#endif
printf("app ready\n");
return 0;
}Hızlı Kontrol
Komut satırı tanımının davranışını tahmin edin.
Özet
Artık koşullu derlemeyi denetleyebilirsiniz:
#ifdef/#ifndef, bir makronun tanımlı olup olmadığını sınar#if/#elif/#else,defined()ile birlikte sabit ifadeleri değerlendirir-DNAME, özellikleri değiştirmek üzere makroları komut satırından tanımlar- Önceden tanımlı platform makroları taşınabilir kod yazmayı sağlar; ekleme koruyucuları çift eklemeyi önler
Sıradaki konu: kodu birden fazla dosyada düzenlemek.
Sıkça Sorulan Sorular
“Koşullu Derleme” dersi ücretsiz mi?
Evet — “Koşullu Derleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Koşullu Derleme” dersinde ne öğreneceğim?
ifdef ve makrolar C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Koşullu Derleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.