C Dilinde Kullanılan Bazı Terimler

Burada C dilinde kullanılan bazı terimlerin nasıl kullanıldığını anlatmaya çalışacağım.

#include Preprocessor

#include terimi başka bir başlık dosyasının içeriğinin kaynak veya başlık dosyasına dahil edilmesini sağlar. #include terimi ile sadece başlık dosyalarını dahil etmeniz önerilir.

Bir başlık dosyasını #include direktifi ile dahil ettiğinizde, o başlık dosyasındaki tüm deyim ve tanımlar dosyanıza dahil edilecektir. Bir başlık dosyası başka bir başlık dosyasını dahil edebilir. Burada önemli olan nokta içiçe başlık dosyalarını dahil etmemektir.

Elimizde 4 adet modul1, modul2, modul3 ve modul4 olarak adlandırılımış modüller olsun. Aşağıdaki şartlarda çalışması istenen bir projede başlık dosyalarını başlık dosyaları içinde dahil ederseniz bu yapıyı kuramazsınız. Başlık dosyaları içinde diğer başlık dosyalarını dahil ederseniz tüm modüller birbirine erişebilir durumda olacaktır ve hata ayıklamak zor olacaktır. Ayrıca derleme süreniz de uzayacaktır.

  • Modul1; modul2’ye ve modul3’e erişebilsin, modul4’e erişemesin.
  • Modul2; modul4’e erişşin, diğerlerine erişemesin
  • Modul3; modul4’e erişsin, diğerlerine erişemesin

Ben kaynak dosyalarında şu sıra ile #include direktiflerini kullanırım.

  1. mikrodenetleyiciye ait başlık dosyaları
  2. Standard C kütüphaneleri başlık dosyaları
  3. Dahil edilecek diğer modül başlık dosyaları
  4. Kaynak dosyasına ait başlık dosyası

#define Preprocessor

#define terimi ile kodda kullanılacak koda özel tanımlamaları tanımlarız. Bu terim ile tek bir değer tanımlamaktan makro fonksiyon tanımlamaya kadar bir çok tanımlama yapabiliriz. Aynı zamanda farklı derleme modları için tanımlama yaparak farklı çıktı üretebiliriz.

Örnek olarak bir projede iki adet baskı devre kartı yada sistem kurdunuz. Bir tanesinde LCD ekran ile direk bilgi alırken diğer kartta LCD ekran bulunmuyor. LCD ekran üzerinde hata ayıklama mesajları gösterirken aynı kodun LCD ekran olmayan test kartında da çalışmasını istiyorsunuz. Bunu yapmak için aşağıdaki gibi bir kod yazabiliriz.

Bu kod ile LCD_DEBUG tanımlamasını aktif ettiğinizde sonucunuz lcd ekrana yazdırılırken, tanımlamayı deaktif ederseniz lcd ekrandan çıktı almazsınız.

volatile

C dilinde anlaşılması zor olan terimlerden birisidir volatile terimi. Direk çevirisi uçucu olan bu terim bir çok hata(İng.bug)’nın ana sebebidir. Kod normal çalışırken optimizasyon açıldığı anda düzgün çalışmamaya başlar ise büyük ihtimal bir değişken volatile tanımlanması gerekirken volatile olarak tanımlanmamıştır.

volatile değişken tanımlanırken kullanılan bir terimdir. Bu terim derleyiciye tanımlanan değişkenin uçucu bir değere sahip olduğunu belirtir.

Peki nedir bu uçucu tanımı? Uçucu; değişkenin değerinin her an değişebileceği ve her seferinde yeni değerin kullanılması gerektiğini belirtir. Aşağıdaki kod üzerinde incelersek:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
volatile unsigned int flag;

void timer_ISR (void)
{
   //....
   flag = 1;
   //....
}

void main (void)
{
   //....
   //....
   if (flag == 1)
   {
      flag = 0;
      //....
      //....
   }
   //....
   //....
}

timer_ISR() fonksiyonu bir zamanlama kesme fonksiyonu olarak çalışıyor. Belirli bir zaman geçtikten sonra periyodik zamanlanmış görevlerin yerine getirilmesi için flag değişkenine 1 değerini atıyor ve main fonksiyonu bu değeri kontrol ederek zamanlanmış görevleri yerine getiriyor. Özellikle birden fazla working register’a sahip işlemcilerde derleyiciler optimizasyon esnasında değişkenleri working registerlarda saklamaya çalışırlar ve gerekmedikçe RAM’den okuma yazma yapmazlar. Eğer derleyiciye flag değişkenin uçucu olduğunu belirtmez isek main() fonksiyonu flag değişkenine ait değeri working register’ına kopyalayacak ve tüm kontrolleri working registerdaki değere göre yapacaktır. flag değişkeninin değeri main() fonksiyonu haricinde bir yerde değiştirildiğinde main() fonksiyonu değişkeni tekrar okuyarak kontrol etmediği için yapılan değişimin bir etkisi olmayacaktır.

const

const constant kelimesinin kısaltması olarak yazılmış ve sabit anlamına gelmektedir. const terimi derleyiciye tanımlanan değişkenin değerinin değiştirilemeyeciğini belirtmektir. Her değiştirelemeyen değişken ROM üzerinde tanımlanmaz. Çoğu durumda const ile tanımlı değişkenler RAM’de tanımlıdır.

static

static terimini Türkçe’ye sabit yada kalıcı olarak çevirebiliriz. C dilinde static terimi kalıcı ve gizli görevlerini yerine getirir. Eğer bir fonksiyon içinde statik değişken tanımlarsanız bu değişken fonksiyondan çıkıldığında değerini muhafaze edecek ama o fonksiyon dışında erişilemez olacaktır. Eğer bir fonksiyon veya genel değişken tanımında static terimini kullanırsanız bu değişken veya fonksiyon diğer modüller tarafından ulaşılamaz olacaktır. Nesne tabanlı programlama dillerindeki private terimine benzer bir kullanım söz konusu olacaktır.