|  | 
        
            | 
                    
                        | C99 Standartları ile Gelen Yenilikler |  |  
                        | 
	
    
		
            | Gönderiliyor lütfen bekleyin... | 
 |  | 
        
            | Dennis Ritchie, Unix işletim sistemi kullanan bir DEC PDP-11 ile C dilini ortaya 
  çıkarmıştır. İlk uygulamalar da bu makine üzerinde yazılmıştır. C dili, BCPL 
  adında bir dilin geliştirilmesi ile başlayan ve B dili ile devam eden bu sürecin 
  bir ürünü olmuştur. 1983 yılında C nin ANSI (American National Standarts Institute 
  - Amerikan Ulusal Standartlar Enstitüsü ) standartlarını belirlemek için bir 
  komite kuruldu. Tahmin edilenden daha uzun süren çalışmalar sonunda (bu sürec 
  6 yıl kadardır) Aralık 1989 da ANSI C standartları kabul edildi. Bu satandartlar 
  ISO (International Standarts Organizations - Uluslararası Standartlar Organizasyonu) 
  tarafından da kabul edilmiştir. Böylece ortaya çıkan standart ANSI/ISO Standart 
  C olarak kabul görmeye başlandı. C den bundan sonra genel olarak C89 olarak 
  bahsedilmeye başlandı. 1995 yılında C için ilk düzeltmeler yapıldı. Daha sonraları 
  ise C için geliştirme süreci hala devam ediyordu. Bu süreçte C nin her özelliği 
  ayrıntılı olarak ele alındı, kullanılan yöntemler elden geçirildi ve yazılım 
  dünyasının gelişmesi sonucunda oluşan yeni talepler de dikkate alınarak yeni 
  düzenlemeler yapıldı. Son olarak 1999 yılında yeni standartlar açıklandı ve 
  C için standartlar C99 standartları oldu. Bu yazıda C99 da yapılan değişiklikleri 
  ana hatları ile inceleyeceğiz.
 
 C99 ile C89’a yeni 
  özellikler eklenmesine karşın, bazı özelliklerde çıkarılmış, bazı özellikler 
  ise geliştirilmiştir. Bu yazıda sırasıyla bu özellikleri inceleyeceğiz.
 
 C99 
  ile Eklenen Özellikler :
 
 C99 standartları ile birikte C diline aşağıdaki yeni anahtar kelimeler eklenmiştir.
 
 
 
 
  Önemli olan diğer 
  eklemeler ise şunlardır :inlinerestrict _Bool_Complex_Imaginary  
 
 
 
  C99 
  ile Dilden Çıkarılan Özellikler:Yeni kütüphaneler 
    ve başlık dosyalarıprintf() ve 
    scanf() fonksiyon ailesinin düzenlenmesideğişken uzunluktaki 
    dizilerKarmaşık sayılar 
    için desteklong long int 
    değişken türüC++ taki gibi 
    // yorum satırı desteğiÖnişlemci için 
    yapılan bazı değişikliklerfor ifadesi 
    içinde değişken tanımlama  
 C99 ile C89 dan 
  çıkarılan en önemli özelliklerin başında "kapalı int" kuralının kaldırılması 
  gelmektedir. Bildiğimiz gibi C de bir tür belirtmediğimiz zaman derleyici bunu 
  herzaman int türünden olduğunu kabul eder. Ek olarak derleyici bir fonksiyonun 
  çağrılma ifadesini gördüğünde eğer fonksiyonun geri dönüş değeri hakkında bilgiye 
  sahip değilse yine geri dönüş değerinin türünü int olarak kabul eder. İşte bu 
  özellik C99 ile kaldırılmıştır. Eğer böyle bir kodunuz varsa C99 u destekleyen 
  bir derleyici ile bu kodu derleyemezsiniz. Kodunuzu yeniden yazmanız gerekmektedir.
 
 C99 ile Değişen ve Yeni Eklenen Özelliklerin İncelenmesi
 
 restrict anahtar 
  kelimesi :
 
 restrict bir tür 
  niteleyicisidir ve yalnızca göstericiler için kullanılabilir.
 
 restrict int *p1;
 restrict int *p2;
 
 Bu ifadelerden 
  derleyici p1 ve p2 yi ayrı nesneler için kullanacağı anlamını çıkarır. Böylece 
  derleyici daha iyi kod optimizasyonu yapabilecektir. Zaten C99 ile C89 da kullanılan 
  birçok fonksiyonun prototiplerine eklenmiştir.
 
 inline anahtar 
  kelimesi :
 
 Yine derleyicinin 
  kodu optimize etmesi için fonksiyonlarımızı c++ daki gibi inline olarak bildirebiliriz. 
  Eğer bir fonksiyon inline olarak bildirilmişse, fonksiyon çağrılmaz bildirildiği 
  yere açılır. Bunun bize ne gibi bir faydası olabilir? Bilindiği gibi bir fonksiyonun 
  çağrılması zahmetli bir iştir. Fonksiyon çağrıldığı zaman değişkenler yığına 
  yerleştirilir, registerlar kaydedilir, fonksiyon çağrılmasından sonra bunlar 
  geri yüklenir vs vs..
 
 Ancak biz fonksiyonu inline olarak bildirirsek bunların hiç biri gerçekleşmez 
  çünkü fonksiyonun kodu, fonksiyonun çağrıldığı yere açılır ve program daha hızlı 
  çalışır. Bunun dezavantajı ise kodun büyümesine neden olmasıdır. Eğer küçük 
  fonksiyonlarımız varsa yada programımızın performansını arttıracak çok kritik 
  fonksiyonlar varsa bunları inline olarak bildirmek en iyi yöntem olacaktır.
 
 Örnek :
 
 
 
   
    | inline int 
        max(int a, int b) {
 return a > b?a:b;
 }
 
 int main()
 {
 int x = 3, y = 5;
 printf("büyük : %d", max(x, 
        y));
 /* eşdeğeri printf("büyük : %d", 
        (x > y ? x : y)); yani max fonksiyonu çağrıldığı yere açılmıştır.*/
 return 0;
 }
 
 
 
 |  _Bool anahtar kelimesi :
 
 _Bool bir int veri türüdür. 1 (true) ve 0 (false) değerlerine sahiptir. C++ 
  daki bool yerine _Bool un kullanılmasının nedeni ise geriye uyumluluktur. Çünkü 
  birçok C programcısı zaten kendi bool türlerini tanımlamış olmalarıdır. C++ 
  daki bool türü ile uyum sağlanmak isteniyor ise <stdbool.h> dosyası dahil 
  edilerek bool makrosu kullanılabilir.
 
 _Complex ve 
  _Imaginary anahtar kelimeleri :
 
 Karmaşık sayıları 
  desteklemek için C99 da yeni başlık dosyaları ve fonksiyonlar eklenmiştir. Böylece 
  nümerik programlamalarda kolaylık sağlanmıştır.
 complex ve imaginary yerine _Complex ve _Imaginary kullanılmasının nedeni ise 
  birçok programda komplex sayılar için bu kelimelerin daha kullanılmasından dolayı 
  bir isim çakışmasına neden olmamak içindir.
 
 long long Tamsayı 
  Tipi
 
 C99 ile yeni tamsayı 
  türü olarak long long int ve unsigned long long int türleri eklenmiştir. Böylece 
  64 bitlik tamsayıları programlarımızda rahatlıkla kullanabiliriz.
 
 long long int -(2^63 -1) ile 2^63-1,
 unsigned long long int 0 ile 2^64 - 1 arasında değer alabilir.
 
 Dizilerdeki 
  Değişiklikler
 
 C89 da bildiğimiz 
  gibi bir dizinin uzunluğunu belirtmek için sabit değerler kullanmak zorunda 
  idik. C99 da ise herhangi bir tamsayı ile dizileri bildirebiliriz. Yani dizinin 
  boyutunu çalışma zamanında da belirleyebiliriz. Bu özellik ile daha kolay kod 
  yazma şansına sahip olundu.
 
 
 
  Peki sizeof operatörü 
  bu durumda nasıl davranacak. Bu özelliğin eklenebilmesi için sizeof operatöründe 
  değişikik yapılmıştır. Bildiğimiz gibi sizeof derleme zamanı operatörüdür. Peki 
  biz çalışma zamanında sizeof u kullanırsak ne olacak. Çalışma zamanında, boyutunu 
  bilemediğimiz bir dizi içi sizeof kullandığımızda sizeof un değeri çalışma zamanında 
  hesaplanacaktır. 
    | void foo(int 
        b1, int b2) {
 int dizi[b1][b2]; // artık C99 ile 
        bu geçerli bir kod.
 }
 
 
 |  
 Ek olarak bir fonksiyon 
  parametresi olarak dizi bildiriminde bulunabiliriz. Dizinin boyutunu ise static 
  anahtar kelimesi ile bildirebiliriz.
 
 
 
 
  Bu tanım ile dizi 
  göstericisinin en az 10 elemanlı bir diziyi göstereceği garanti altına alınmıştır. 
    | int foo(int 
        dizi[static 10]) {
 …..
 }
 
 
 |  
 Ayrıca yapılarda 
  da bu özellik kullanılabilir.
 
 
 
  Tek Satırlık 
  Yorum : 
    | struct structFoo {
 int x;
 int y;
 int dizi[];
 }
 
 struct structFoo 
        *s;
 
 s = (struct 
        structFoo *) malloc(sizeof(struct structFoo) + 5 * sizeof(int)); // dizi 
        için 5 int lik alan ayırıyoruz.
 
 
 |  
 C++ da // kullanılarak tek satırlık yorum satırları ekleyebiliriz. Bu özellik 
  C99 ile C diline dahil edilmiştir. Birçok programcı halen uzun yorumlarını C 
  nin geleneksel çok satırlı açıklamalarını kullanarak yapar.
 
 Değişken Bildirimleri 
  :
 
 Bildiğimiz gibi 
  C89 da ilk kod ifadelerinden önce değişkenler tanımlanmalıdır. C99 ile değişkenleri 
  artık C++’taki gibi istediğimiz yerde bildirebiliriz.
 
 Örneğin
 
 
 
  for Döngüsü 
  İçinde Değişken Bildirme : 
    | int main() {
 int i;
 
 i = 5;
 int j; // C89 da error(hata) C99 da ise 
        legaldir.
 
 j = i * 5;
 printf("%d - %d", i, j);
 
 return 0;
 }
 
 
 |  
 C99 ile for döngüsünde 
  değişiklikler yapılarak döngünün ilk kısmında bir yada daha fazla değişken
 
 edebiliriz. Tanımladığımız 
  değişkenlerin kapsamı ise for bloğu ile sınırlıdır.
 
 Örneğin :
 
 
 
  for döngüsünde 
  tanımlanan i değişkeni döngü bittiği zaman yok edilir. Bu özellik C++ da zaten 
  sıklıkla kullanılmaktadır. 
    | int main() {
 int i = -1;
 
 for(int 
        i = 0; i < 5; ++i)
 printf("%d 
        ", i); //0 1 2 3 4 5
 
 printf("%d 
        ", i); // -1
 
 return 
        0;
 }
 
 
 |  
 Dizilerde İlk 
  Değer Atama :
 
 C99 ile programcılara 
  kolaylık sağlayacak yeni bir özellik eklendi. Örneğin dizinin bazı elemanlarına 
  değer atarken diğer elemanlarına değer atamak istemeyebiliriz. C99 ile bu mümkün 
  olabilmektedir.
 
 Örneğin :
 
 
 
   
    | int dizi[10] 
        = {[3] = 5, [5] = 15}; 
 Bu özellik 
        yapılarda şöyle kullanılır.
 
 struct structFoo
 {
 int a;
 int b;
 int c;
 } sFoo = {.c = 67, .a = 65}; // b ye değer atamak istemedik.
 
 
 |  printf() ve scanf() fonksiyon ailesindeki değişiklikler :
 
 C99 ile printf 
  ve scanf fonksiyon aileleri long long int ve unsigned long long int veri türleri 
  ile çalışma yeteneği eklenmiştir. long long için biçim belirleyici olarak ll 
  kullanılır.
 Örneğin :
 
 
 
  C89 daki Limitlerin 
  Artırılması : 
    | int main() {
 long long int a;
 unsigned long long int u_b;
 
 printf("%lld - %llu ", a, 
        u_b);
 
 return 
        0;
 }
 
 
 |  
 Bilindiği gibi 
  C89 da C derleyicileri öğeleri (case sayısı, fonks. Parametre sayısı, iç içe 
  blok sayısı vs vs) ele alıp incelemesi için bazı kısıtlamalar vardı. Bunlar 
  C99 ile arttırılmıştır. Örneğin
 
 
 
 
   
    | Sınır | C89 | C99 |   
    | İç 
      içe blok sayısı | 15 | 27 |   
    | Değişken 
      isim uzunluğu(anlamlı) | 31 | 63 |   
    | extern 
      değişken "" "" | 6 | 31 |   
    | Yapı 
      ve union daki üye sayısı | 127 | 1023 |   
    | Fonksiyon 
      çağırırken parm. Sayısı | 31 | 127 |  return 
  ifadesindeki değişiklik :
 
 C89 da bir fonksiyonun 
  geri dönüş değeri void değilse biz fonksiyonu return; ile sonlandırabiliridik. 
  Bu özellik C99 ile kaldırılmıştır. Yani aşağıdaki metot bildirimi artık geçersizdir.
 
 
 
  C99 ile gelen 
  yeni kütüphaneler : 
    | int foo() {
 return; // error bir değer döndürmelidir.
 }
 
 
 |  
 C99 ile bazı yeni 
  kütüphane ve başlık dosyaları dahil edilmiştir.
 Bunlardan bazıları;
 
 <complex.h> 
  karmaşık sayıları destekler
 <inttypes.h> standart, taşınabilir tamsayılar tanımlıdır.
 
 
 Örneğin:
 
 int16_t tam olarak 16 bitlik tamsayı
 intmax_t enbüyük tamsayı tipi
 uintmax_t enbüyük işaretsiz tamsayı tipi
 
 <wchar.h> Unicode karekter fonksiyonalarını destekeler.
 
 Bu değişiklikler 
  sonunda bir kez daha gördük ki C yine kendini ve gücünü ispatlamıştır. Birçok 
  yenilik eklenmesine karşın C doğallığından ve esnek yapısından hiçbirşey kaybetmemiş 
  aksine gücüne güç katmıştır.
 
 
 
                Makale:C99 Standartları ile Gelen Yenilikler C ve Sistem Programlama Oğuz Yağmur
 | 
        
            |  | 
        
            |  | 
        
            | 
                    
                        
                            
                        
                            Eklenen Son 10 
                            Bu Konuda Geçmiş 10 
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                            Son Eklenen 10 Makale Yükleniyor
                         
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         | 
        
            |  |