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, #includedirektifle dahil ettiğiniz tüm başlık dosyalarını arar .

Ayrıca, kullanarak tanımladığınız her sabite bakar #defineve 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 #includeve #definevar #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 DEBUGsabitin 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 #definebir 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 #ifndeftersini de kontrol etmeliyiz (makro tanımlanmamış).

Aynı görevi #if definedve #if !definedyapmak 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 aaaabiçiminde , derleme tarihine çevirir
  • __TIME__hh:mm:ssbiçiminde , derleme zamanına çevirir