Özellik Sınama Makroları
Önceki Kütüphanenin Kullanımı Sonraki
Özellik Sınama Makroları
Bir kaynak dosyasını derlerken kullanabileceğiniz özelliklerden istediklerinizi özellik sınama makrolarını tanımlayarak kontrol edebilirsiniz.
Yazılımınızı gcc -ansi[91] kullanarak derlediğinizde, bir veya birkaç özellik makrosu tanımlamamışsanız sadece ISO C kütüphanesinin özelliklerini elde edebilirsiniz.
Bu makroları kaynak kod dosyalarınızın en tepesinde #define önişlemci deyimini kullanarak tanımlayabilirsiniz. Bu deyimler, #include deyimlerinden de önce olmalıdır. Daha iyi açıklamak için bu deyimlerden önce sadece açıklamalar bulunabilir diyebiliriz. Bundan başka GCC'nin -D seçeneği ile de bu makrolar kullanılabilirse de makroların kaynak dosyaların kendisinde tanımlanması daha iyidir.
Bu sistem çok sayıda standardı destekleyen kütüphane oluşturmayı mümkün kılar. Farklı standartlar çoğunlukla bir başka standardın üzerine birşeyler ekler ve birbirileriyle de uyumsuzlardır. Geniş kapsamlı standartların gerektirdiği işlev isimleri kullanıcıya kalan isim alanını da küçültür. Bu ukalalıktan öte, pratikte sorunlar oluşturur. Örneğin, bazı GNU dışı yazılımlar, bu kütüphanede bulunan getline işlevinin yaptığından tamamen farklı işlemler yürüten bir getline işlevi içerebilir ve bunlar eğer tüm özellikleriyle ayrım yapmaksızın etkin kılınırsa uyumluluk sağlanamaz.
Bu durumdan, bir yazılım ancak sınırlı sayıda standarda uygun olabilir sonucu çıkarılmamalıdır. Üzerinde ayrım yapılamayan geniş standartlar uyumluluk için yetersizdir. Standart dışı başlık dosyalarının içerilmesinden ya da standart içinde tanımlanmamış özelliklerin katıştırılmasından sizi koruyamaz.
_POSIX_SOURCE
makro
Bu makroyu #define ile belirtirseniz, ISO C özelliklerine ek olarak POSIX.1 standardının (IEEE Standard 1003.1) işlevselliğine de sahip olunur.
Bir pozitif tamsayıyı _POSIX_C_SOURCE makrosuna atarsanız _POSIX_SOURCE etkisiz olacaktır.
_POSIX_C_SOURCE
makro
Bu makroya atayacağınız pozitif tamsayılarla hangi POSIX özelliklerinin etkin olacağını belirleyebilirsiniz. Daha büyük değerler daha büyük işlevsellik sağlar.
Bu makroya 1 ya da daha büyük bir tamsayı atarsanız, POSIX.1 standardının 1990 sürümündeki (IEEE Standard 1003.1-1990) işlevselliği elde edersiniz.
Bu makroya 2 ya da daha büyük bir tamsayı atarsanız, POSIX.2 standardının 1992 sürümündeki (IEEE Standard 1003.2-1992) işlevselliği elde edersiniz.
Bu makroya 199309L ya da daha büyük bir tamsayı atarsanız, POSIX.1b standardının 1993 sürümündeki (IEEE Standard 1003.1b-1993) işlevselliği elde edersiniz.
Daha büyük değerler ise geleceğe yönelik genişletmeleri etkin kılacaktır. POSIX standardının gelişim sürecinde bu değerler tanımlandıkça, GNU C kütüphanesi onlar standart haline geldikçe destekleyecektir. _POSIX_C_SOURCE'a 199506L ya da daha büyük bir tamsayı atarsanız, POSIX.1 standardının 1996 sürümündeki (ISO/IEC 9945-1: 1996) işlevselliği elde edersiniz.
_BSD_SOURCE
makro
Bu makro belirtilirse, 4.3 BSD Unix'den türetilmiş işlevselliğe ek olarak ISO C, POSIX.1 ve POSIX.2 işlevselliği elde edilir.
4.3 BSD Unix'den türetilmiş bazı oluşumlar POSIX.1 standardındaki bazı özelliklerle çelişir. Bu makro kullanıldığında 4.3 BSD tanımlamaları POSIX.1 tanımlamalarına göre öncelikli olur.
4.3 BSD ile POSIX.1 arasındaki bazı çakışmalardan dolayı, BSD uyumluluğu ile derlediğiniz yazılımlarınızı ilintilerken özel BSD uyumluluk kütüphanesi kullanmanız gerekebilir. Bu farkları giderebilmek için bazı işlevlerin iki farklı yolla tanımlanmaları gerekir. Biri normal C kütüphanesi, diğeri uyumluluk kütüphanesidir. Yazılımınızda _BSD_SOURCE makrosunu kullanıyorsanız, -lbsd-compat seçeneği ile derlemelisiniz. Bu derleyici veya ilintileyiciye, işlevleri normal C kütüphanesinde değil, uyumluluk kütüphanesinde araması gerektiğini söyler.
_SVID_SOURCE
makro
Bu makro belirtilirse, SVID'den türetilmiş işlevselliğe ek olarak ISO C, POSIX.1, POSIX.2 ve X/Open işlevselliği de elde edilir.
_XOPEN_SOURCE
makro
_XOPEN_SOURCE_EXTENDED
makro
Bu makro belirtilirse, X/Open Taşınabilirlik Kılavuzunda açıklanan işlevsellik elde edilir. Bu POSIX.1 ve POSIX.2 işlevselliğinin üstünde bir genişletme içerdiğinden _POSIX_SOURCE ve_POSIX_C_SOURCE kendiliğinden tanımlanmış olur.
Tüm Unixlerin aynı olması ilkesinden hareketle, sadece BSD ve SVID'de geçerli işlevselliği de içerir.
Eğer _XOPEN_SOURCE_EXTENDED makrosu da ayrıca belirtilmişse, fazladan bir işlevsellik eklenir. Bu fazladan işlevler, X/Open Unix ticari sürümünün gerektirdiği tüm işlevleri sağlayacaktır.
_XOPEN_SOURCE makrosuna 500 değeri atanırsa, mevcut işlevselliğe ek olarak Single Unix Specification, version 2 içindeki yeni tanımlar da içerilecektir.
_LARGEFILE_SOURCE
makro
Bu makro belirtilirse tüm önceki standarlardaki bazı yetersizlikleri düzelten ek işlevler tanımlanmış olur. Özellikle, fseeko ve ftello işlevlerini kullanmak içindir. Bu işlevler olmaksızın ISO C arayüzü (fseek, ftell) ile düşük seviyeli POSIX arayüzü (lseek) arasında bazı sorunlar çıkacaktır.
Bu makro, Büyük Dosya Desteğinin (LFS - Large File Support) bir parçası olarak kütüphaneye dahil edilmiştir.
_LARGEFILE64_SOURCE
makro
Bu makroyu belirtirseniz, içerdiği ek işlevlerle 32 bitlik sistemlerdeki 2GB'lık dosya büyüklüğü sınırı aşılabilir. Bu arayüz, büyük dosyaları desteklemeyen sistemlerde kullanılamaz. Doğal dosya büyüklüğü 2GB'dan büyük olan sistemlerde (örn, 64 bitlik sistemler) ise yeni işlevler, mevcutlarla eşdeğerdedir.
Bu yeni işlevsellik mevcut olan türler ve işlevlerle yer değiştirilerek kullanılır. Bu yeni nesnelerin isimlerinde maksadını ifade edecek şekilde 64 bulunur. Örneğin, off_t yerine off64_t, fseeko yerine fseeko64 gibi.
Bu makro, Büyük Dosya Desteğinin (LFS - Large File Support) bir parçası olarak kütüphaneye dahil edilmiştir. 64 bitlik kullanım halen genele yansımadığından bu bir geçiş dönemi arayüzüdür. (Aşağıdaki _FILE_OFFSET_BITS makrosunun açıklamalarına bakınız).
_FILE_OFFSET_BITS
makro
Bu makro sistemde hangi dosya sistemi arayüzünün kullanılacağını belirlemekte kullanılır. _LARGEFILE64_SOURCE, bir ek arayüz olarak 64 bitlik arayüzü etkin kılar. _FILE_OFFSET_BITS ise 64 bitlik arayüzün eski arayüzle değiştirilmesini mümkün kılar.
_FILE_OFFSET_BITS belirtilmemişse veya 32 değeri ile belirtilmişse hiçbir etkisi olmaz. 32 bitlik arayüz, 32 bitlik sistemlerde 32 bitlik off_t türü ile kullanılmaya devam eder.
Makro, 64 değeri ile belirtilmişse, büyük dosya arayüzü eski arayüzle değiştirilir. Yani işlevler farklı isimler altında olmaz, eski işlev isimleri yenileri için geçerli olur. Siz fseeko işlevini çağırdığınızda aslında fseeko64 işlevini kullanmış olursunuz.
Bu makro sadece, sistem büyük dosyalarla çalışabileceğiniz bir mekanizma sağlıyorsa belirtilebilir. 64 bitlik sistemlerde bu makro etkisizdir. *64 isimli işlevler normal işlevlerle eşdeğerdir.
Bu makro, Büyük Dosya Desteğinin (LFS - Large File Support) bir parçası olarak kütüphaneye dahil edilmiştir.
_ISOC99_SOURCE
makro
ISO C standardı yeniden gözden geçirilip düzeltilinceye kadar yeni özellikler geniş uygulama alanı bulsalar bile özdevinimli olarak etkinleştirilmez. Buna rağmen GNU libc yeni standardın tam bir gerçeklemesine sahiptir ve bu yeni özellikler _ISOC99_SOURCE makrosu ile etkinleştirilebilir.
_GNU_SOURCE
makro
Bu makro belirtildiğinde herşey etkin olur: SO C89, ISO C99, POSIX.1, POSIX.2, BSD, SVID, X/Open, LFS ve GNU oluşumları. Bu durumda POSIX.1 ile BSD arasındaki çakışmalar için öncelik POSIX.1'dedir.
_GNU_SOURCE makrosunun tam etkili ancak BSD'nin öncelik almasını isterseniz, bunu makroların belirtilme sırasını aşağıdaki gibi düzenleyerek yapmalısınız:
#define _GNU_SOURCE
#define _BSD_SOURCE
#define _SVID_SOURCE
Bunu yaparsanız, derleyici ya da ilintileyiciye -lbsd-compat seçeneğini vererek yazılımınızın BSD uyumluluk kütüphanesi ile ilintilenmesini sağlamalısınız.
Not
Bunu yapmayı unutursanız, yazılımın çalışması sırasında çok tuhaf hatalarla karşılaşabilirsiniz.
_REENTRANT
makro
_THREAD_SAFE
makro
Bu makroları belirttiğinizde bazı işlevlerin evresel (reentrant) sürümleri bildirilmiş olur. Bu işlevlerin bazıları POSIX.1c içinde belirtilmişse de bir çoğu GNU libc'ye özeldir, bir kısmı da diğer bazı sistemlerde kullanılmaktadır. Sorun standartlaştırmadaki gecikmeden kaynaklanmaktadır.
Birtakım başka sistemlede ise C kütüphanesinin buna özel bir sürümü yoktur. Sadece tek bir sürüm vardır ancak derleme sırasında bu durumun belirtilmesi gerekir.
Yeni yazacağınız yazılımlarda _GNU_SOURCE kullanmanızı öneririz. GCC'ye -ansi seçeneğini belirtmez ve bu makrolardan hiçbirini kaynak kodunuzda belirtmezseniz bunun etkisi _POSIX_C_SOURCE makrosunun 2 ile, _POSIX_SOURCE, _SVID_SOURCE ve _BSD_SOURCE makrolarını 1 ile atamakla eşdeğerdedir.
Daha geniş özellikler içeren bir özellik sınama makrosu ile birlikte bu makronun kapsamında olan makrolardan birini ayrıca belirtmenin bir etkisi yoktur. Örneğin, _POSIX_C_SOURCE makrosundan sonra _POSIX_SOURCE makrosunun belirtilmesinin bir etkisi olmayacaktır. Benzer şekilde _GNU_SOURCE makrosundan sonra belirtilen _POSIX_SOURCE veya _POSIX_C_SOURCE ya da _SVID_SOURCE makrolarının bir etkisi olmaz.
Yalnız, _BSD_SOURCE makrosu hiçbir makronun kapsamında değildir. Bu, BSD ile POSIX arasındaki bazı çakışmalardan dolayı hangisinin öncelik alacağını belirleyebilmek bakımından böyledir. Diğer özellik sınama makrolarına ek olarak belirtilen _BSD_SOURCE bir etki oluşturacaktır: POSIX ile çakışan özellikler için BSD özellikleri öncelikli olacaktır.


[91] GCC seçeneklerinin bir listesini gcc --help ile görebilirsiniz.
Önceki Üst Ana Başlık Sonraki
Anahtar Sözcükler Başlangıç Kılavuzun Yol Haritası
Bir Linux Kitaplığı Sayfası