Preprocessors, #include, #define, #if, #ifdef

Kategori: C , 26 Haziran 2019 , JanFranco


Programımızdaki kodları build ederken, compiler source code'dan önce preprocessleri görür. Bu compiler'ı az da olsa yönetebilmemizi sağlar. Daha önce de kullandığımız için preprocesserler yabancı bir kavram değil. include ile başlayalım:

#include 
#include "mathfuncs.h"

include ile programımıza dışarıdan kütühane vs. dahil edebiliriz. Eğer dahil edeceğimiz kaynaklar sistemde varsa ilk satırdaki gibi < > işaretleri arasında tanımlanır. Eğer kendi oluşturduğumuz yani local alanda olan bir dsoyayı daihl edeceksek " " işaretleri arasında tanımlarız. define ile devam edelim:

#define PI 3.14159265358979

define ile constant yani sabit değerler atayabiliriz ve bunu tüm projede kullanabiliriz. Adından anlaşılacağı gibi bu değerler sonradan değiştirilemezler. Yani biz define satırını güncelleyebiliriz ancak programın içinde PI = 5; gibi bir işlem yapamayız. define ile sadece değişkenler değil fonksiyonlar da tanımlayabiliriz:

#define TIMES3490(x) ((x)*3490)

void evaluate(void){
    printf("40 * 3490 = %d\n", TIMES3490(40));
}

Burada yapılan işlemi compiler şu şekilde algılar:

void evaluate(void){
    printf("40 * 3490 = %d\n", ((40)*3490));
}

Son olarak if ve ifdef preprocesserlardan bahsedelim. Aslında bunlardan bir önceki dökümantasyonda, multifile projects dökümantasyonunda bahsetmiştik. Alışık olduğumuz if else bloklarının bir başka hali sadece. ifdef ise eğer tanılıysa anlamına geliyor. Bu preprocesserları projeye dosya dahil ederken kullanabileceğimiz gibi başka alanlarda da kullanabiliriz. Örneğin projemiz hem linux sistemlerde hem de windows üzerinde çalışacaksa ve kodlar bu iki sistem üzerinde farklılık gösteriyorsa bu preprocesserları kullanabiliriz:

void run_command_shell(void){
    #ifdef WIN32
        system("COMMAND.EXE");
    #elifdef LINUX
        system("/bin/bash");
    #else
    #error ERROR!!!
    #endif
}

Burada elifdef, else ifdef anlamına geliyor. Bu şekilde iki farklı sistem için iki farklı kod yazabiliriz.


Sonraki Yazı: Dynamic 2D Array with Double Pointer
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın