|
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.
- inline
- restrict
- _Bool
- _Complex
- _Imaginary
Önemli olan diğer
eklemeler ise şunlardır :
- Yeni kütüphaneler
ve başlık dosyaları
- printf() ve
scanf() fonksiyon ailesinin düzenlenmesi
- değişken uzunluktaki
diziler
- Karmaşık sayılar
için destek
- long long int
değişken türü
- C++ taki gibi
// yorum satırı desteği
- Önişlemci için
yapılan bazı değişiklikler
- for ifadesi
içinde değişken tanımlama
C99
ile Dilden Çıkarılan Özellikler:
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.
void foo(int
b1, int b2)
{
int dizi[b1][b2]; // artık C99 ile
bu geçerli bir kod.
}
|
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.
Ek olarak bir fonksiyon
parametresi olarak dizi bildiriminde bulunabiliriz. Dizinin boyutunu ise static
anahtar kelimesi ile bildirebiliriz.
int foo(int
dizi[static 10])
{
…..
}
|
Bu tanım ile dizi
göstericisinin en az 10 elemanlı bir diziyi göstereceği garanti altına alınmıştır.
Ayrıca yapılarda
da bu özellik kullanılabilir.
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.
|
Tek Satırlık
Yorum :
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
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;
}
|
for Döngüsü
İçinde Değişken Bildirme :
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 :
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;
}
|
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.
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 :
int main()
{
long long int a;
unsigned long long int u_b;
printf("%lld - %llu ", a,
u_b);
return
0;
}
|
C89 daki Limitlerin
Artırılması :
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.
int foo()
{
return; // error bir değer döndürmelidir.
}
|
C99 ile gelen
yeni kütüphaneler :
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
|
|