Preprocessing

Preprocessing konusuna değinilen kısım.

Preprocessing Nedir?

Preprocessor, kaynak kodunuzu derlenmeden önce dönüştüren bir makro ön işlemcidir (makrolar tanımlamanıza izin verir). Bu dönüşümler başlık dosyalarının dahil edilmesi, makro genişletmeleri vb. olabilir. Tüm ön işlemci yönergeleri # sembolü ile başlar.

Ön işlemci komutları, # karakteri ile başlayan satırlardır ve ön işlemci tarafından ön işlemci komutları olarak yorumlanır. Bu komutlar, kendi sözdizimi ve anlambilimi olan basit bir makro dilidir.

Ön işlemci komutlarının bazı örnekleri şunlardır:

  • #define bir ön işlemci makrosunu tanımlar. Örneğin, #define PI 3.14 PI'yi 3.14 olarak değiştirir. Makrolar küçük fonksiyonlar gibi çağrılabilir, ancak işlenmesi daha az yük getirir. Makrolar nesne benzeri (parametre almaz) veya işlev benzeri (parametre alabilir) olabilir. Bir makro tanımını #undef ile silmek mümkündür.

  • #include başka bir dosyadan belirli bir başlık dosyasını ekler. Örneğin, #include <stdio.h> ön işlemciye stdio.h dosyasındaki tüm içeriği dahil etmesini söyler. Bu ayrıca çift tırnak içinde de yazılabilir - #include "stdio.h". Not: Dosya adı açılı ayraç içindeyse, dosya standart derleyici include yollarında aranır. Dosya adı çift tırnak içindeyse, arama yolu geçerli kaynak dizinini içerecek şekilde genişletilir.

  • #undef bir ön işlemci makrosunu tanımsız bırakır. Örneğin, #undef FILE_SIZE FILE_SIZE'ı tanımsız bırakır.

  • #ifdef bu makro tanımlanmışsa true döndürür. Örneğin, #ifdef DEBUG /* Hata ayıklama ifadeleriniz burada */ #endif DEBUG tanımlanmışsa, kapalı ifadeleri işler. Bu, derleme sırasında -DDEBUG bayrağını gcc derleyicisine geçirdiğinizde yararlıdır. Bu DEBUG'yi tanımlayacak, böylece derleme sırasında hata ayıklamayı açıp kapatabilirsiniz.

  • #ifndef bu makro tanımlanmamışsa true döndürür. Örneğin, #ifndef MESSAGE #define MESSAGE "You wish!" #endif MESSAGE zaten tanımlanmamışsa MESSAGE'yi tanımlar.

  • #endif ön işlemci koşulunu sonlandırır. Örneğin, #if defined(__linux__) /* Linux için kod */ #endif Linux için kodu işledikten sonra koşulu sonlandırır.

  • #if derleme zamanındaki bir koşulun doğru olup olmadığını test eder. Örneğin, #if __STDC__ /* ANSI C kodu */ #else /* Geleneksel C kodu */ #endif STDC doğruysa ANSI C kodunu işler, değilse geleneksel C kodunu işler.

  • #else #if'in alternatifidir. Örneğin, #if defined(__linux__) /* Linux için kod */ #else /* Diğer platformlar için kod */ #endif Linux tanımlanmışsa Linux için kodu işler, değilse diğer platformlar için kodu işler.

  • #elif #else ve #if'i tek bir ifadede birleştirir. Örneğin, #if defined(__linux__) /* Linux için kod */ #elif defined(_WIN32) /* Windows için kod */ #else /* Diğer platformlar için kod */ #endif Linux tanımlanmışsa Linux için kodu işler, _WIN32 tanımlanmışsa Windows için kodu işler, hiçbiri tanımlanmamışsa diğer platformlar için kodu işler.

  • #error stderr üzerinde hata mesajı yazdırır. Örneğin, #if !defined(__cplusplus) #error A C++ compiler is required! #endif __cplusplus tanımlanmamışsa, bir C++ derleyicisi gerektiğini söyleyen bir hata mesajı verir.

  • #warning stderr üzerinde uyarı mesajı yazdırır. Örneğin, #warning This is a work in progress #endif Bu bir devam eden çalışmadır diye bir uyarı mesajı verir.

  • #pragma derleyiciye standartlaştırılmış bir yöntem kullanarak özel komutlar verir. Örneğin, #pragma once aynı başlık dosyasının birden fazla kez dahil edilmesini önler.

// Ön işlemci komutlarını dahil etmek için #include kullanılır
#include <stdio.h> // standart giriş/çıkış fonksiyonları için

// Ön işlemci makrolarını tanımlamak için #define kullanılır
#define PI 3.14 // PI sayısını tanımlar
#define SQUARE(x) ((x) * (x)) // bir sayının karesini hesaplar
#define MAX(a, b) ((a) > (b) ? (a) : (b)) // iki sayının en büyüğünü döndürür

// Ön işlemci koşullarını kontrol etmek için #if, #else, #elif ve #endif kullanılır
#if defined(__linux__) // __linux__ makrosu Linux'ta tanımlanmışsa
    #define OS "Linux" // OS makrosunu "Linux" olarak tanımlar
#elif defined(_WIN32) // _WIN32 makrosu Windows'ta tanımlanmışsa
    #define OS "Windows" // OS makrosunu "Windows" olarak tanımlar
#else // hiçbiri tanımlanmamışsa
    #define OS "Unknown" // OS makrosunu "Unknown" olarak tanımlar
#endif

// Ön işlemci hata mesajları vermek için #error ve #warning kullanılır
#ifndef PI // PI makrosu tanımlanmamışsa
    #error PI is not defined! // hata mesajı verir
#endif

#ifdef DEBUG // DEBUG makrosu tanımlanmışsa
    #warning Debug mode is on! // uyarı mesajı verir
#endif

// Ön işlemci özel komutlar vermek için #pragma kullanılır
#pragma once // aynı başlık dosyasının birden fazla kez dahil edilmesini önler

int main() 
{
    double radius, area, circumference; // değişkenleri tanımlar

    printf("Enter the radius of the circle: "); // yarıçapı isteyen mesaj yazdırır
    scanf("%lf", &radius); // yarıçapı okur

    area = PI * SQUARE(radius); // alanı hesaplar
    circumference = 2 * PI * radius; // çevreyi hesaplar

    printf("The area of the circle is %.2f\n", area); // alanı yazdırır
    printf("The circumference of the circle is %.2f\n", circumference); // çevreyi yazdırır

    printf("The maximum of 10 and 20 is %d\n", MAX(10, 20)); // maksimumu yazdırır

    printf("The operating system is %s\n", OS); // işletim sistemini yazdırır

    return 0; // programdan çıkar
}

Last updated