C ile programlama yaparken bize çok yardımcı olan bir araçtır. Tıpkı dil, derleyici ve standart kitaplık gibi C Standardının bir parçasıdır.
Programımızı ayrıştırır ve derleyicinin sürece devam etmeden önce ihtiyaç duyduğu her şeyi almasını sağlar.
Pratikte ne işe yarar?
Örneğin, #include
direktifle dahil ettiğiniz tüm başlık dosyalarını arar .
Ayrıca, kullanarak tanımladığınız her sabite bakar #define
ve onu gerçek değeriyle değiştirir.
Bu sadece başlangıç ve bu 2 operasyondan bahsetmiştim çünkü bunlar en yaygın olanları. Önişlemci çok daha fazlasını yapabilir.
Başında bir fark ettiniz mi #include
ve #define
var #
mı? Bu, tüm önişlemci yönergelerinde ortaktır. Bir satır ile başlıyorsa #
, bu önişlemci tarafından halledilir.
Şartlılar
Yapabileceğimiz şeylerden biride, bir ifadenin değerine bağlı olarak programımızın nasıl derleneceğini değiştirmek için koşul ifadeleri kullanmaktır.
Örneğin DEBUG
sabitin 0 olup olmadığını kontrol edebiliriz :
#include <stdio.h>
const int DEBUG = 0;
int main(void) {
#if DEBUG == 0
printf("I am NOT debuggingn");
#else
printf("I am debuggingn");
#endif
}
Sembolik sabitler
Sembolik bir sabit tanımlayabiliriz :
#define VALUE 1
#define PI 3.14
#define NAME "Flavio"
Programımızda NAME veya PI veya VALUE kullandığımızda, önişlemci programı çalıştırmadan önce adını değer ile değiştirir.
Sembolik sabitler çok kullanışlıdır çünkü derleme zamanında değişkenler oluşturmadan değerlere isim verebiliriz.
Makrolar
İle #define
bir makro da tanımlayabiliriz . Bir makro ile sembolik sabit arasındaki fark, bir makronun bir argümanı kabul edebilmesi ve tipik olarak kod içermesi, sembolik bir sabit ise bir değer olmasıdır:
#define POWER(x) ((x) * (x))
Ön derleme sürecinde makro değiştirildiğinde sorunları önlemek için iyi bir uygulama olan argümanların etrafındaki parantezlere dikkat edin.
O zaman bunu kodumuzda şu şekilde kullanabiliriz:
printf("%un", POWER(4)); //16
İşlevlerle arasındaki en büyük fark, makroların, bazı durumlarda kullanışlı olabilecek bağımsız değişkenlerinin veya dönüş değerlerinin türünü belirtmemesidir.
Tanımlanmışsa
Sembolik bir sabitin mi yoksa bir makronun mı tanımlandığını şu şekilde kontrol edebiliriz #ifdef
:
#include <stdio.h>
#define VALUE 1
int main(void) {
#ifdef VALUE
printf("Value is definedn");
#else
printf("Value is not definedn");
#endif
}
Bunun #ifndef
tersini de kontrol etmeliyiz (makro tanımlanmamış).
Aynı görevi #if defined
ve #if !defined
yapmak için de kullanabiliriz .
Bazı kod bloğunu aşağıdaki gibi bir bloğa sarmak yaygındır:
#if 0
#endif
çalışmasını geçici olarak engellemek veya bir DEBUG sembolik sabiti kullanmak için:
#define DEBUG 0
#if DEBUG
//code only sent to the compiler
//if DEBUG is not 0
#endif
Kullanabileceğiniz önceden tanımlanmış sembolik sabitler
Önişlemci aynı zamanda kullanabileceğiniz bir dizi sembolik sabiti tanımlar ve addan önce ve sonra 2 alt çizgi ile tanımlanır, bunlara alt kısımda belirtmiş olduğumuz 2 alt çizgili tanımlarda dahildir:
__LINE__
kaynak kod dosyasındaki geçerli satıra çevirir__FILE__
dosyanın adına çevirir__DATE__
Mmm gg aaaa
biçiminde , derleme tarihine çevirir__TIME__
hh:mm:ss
biçiminde , derleme zamanına çevirir