Bu yapı inline işlevlerin inline açılımının gerçekleştirilip gerçekleştirilmemesini bir anahtar olarak kullanılan makroya bağlar.
Debug sürecinde inline işlevlerin inline olarak açılımının devreden çıkarılması ve yeniden devreye alınması çok sık duyulan bir ihtiyaçtır. Ancak programın son sürümü (ticari sürümü) oluşturulduğunda genellikle bu işlevlerin inline olarak açılması istenir.
inline açılım yapılması ve yapılmaması arasında sık sık yapılan geçişler bu işlemin daha pratik bir şekilde yapılması gereksinimini doğurmaktadır. inline işlevlerin derleyici tarafından inline olarak açılması isteniyorsa bu işlevler şüphesiz başlık dosyasına konulmalıdır. Derleyicinin bu işlevleri inline olarak açması istenmiyorsa bu işlevlerin tanımları cpp dosyasında yer almalıdır. inline olmayan işlevler başlık dosyasına konulmamlıdır. Bu işlevlerin başlık dosyalarına konulmaları durumunda kaynak dosyalara her eklendiği durumda yeniden tanımlanmaları söz konusudur. Öte yandan inline işlev tanımları başlık dosyasında yer almazlarsa derleyici bu işlevlerin tanımarımı göremez ve gerekli kodları oluşturamaz. Her iki durumda da bağlama (link) aşamasında bağlayıcı program işini yapmayacaktır.
Çözüm için tüm inline işlevleri ipp uzantılı işlevlerin tanımlarını .ipp uzantılı bir dosyaya koyuyor ve bu tanımlara INLINE makrosunu ekliyoruz.
Tüm uygulamalarda olduğu gibi başlık dosyası ve kod dosyası normal olarak oluşturulacak ancak .ipp uzantılı dosyamız inline açılımının istenip istenmediğine bağlı olarak ya başlık dosyası ya da kod dosyası tarafından dahil edilecek.
1 2 3 4 5 |
// necati.ipp dosyası INLINE void Neco::func() { //kodlar } |
Başlık dosyasını ise aşağıdaki gibi yapılandıracağız:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// necati.hpp dosyası #ifndef _NECO_H // Çoklu dahil etmeye karşı koruma #define _NECO_H class Neco { public: void func(); }; #ifdef INLINE_ENABLED #define INLINE inline // INLINE sözcüğü inline anahtar sözcüğüyle yer değiştirecek #include "neco.ipp" // yalnızca INLINE_ENABLED tanımlıysa dahil edilecek //ve tanımlanan işlev inline olacak #endif #endif // _NECO_H |
Kod dosyamız ise aşağıdaki gibi yapılandırılacak:
1 2 3 4 5 6 7 8 |
//neco.cpp dosyası #include "neco.hpp" // Başlık dosyası normal biçimde dahil ediliyor #ifndef INLINE_ENABLED #define INLINE // INLINE makrosu silinecek #include "neco.ipp" // INLINE_ENABLED tanımlı değil ise //dahil edilecek yani inline açılımı devre dışı bırakılacak #endif |
Başlangıçta biraz karışık gibi görünebilir. Gelin şimdi son duruma bakalım:
Eğer inline açılım isteniyor ise INLINE_ENABLED makrosu tanımlanacak, inline açılım istenmiyorsa INLINE_ENABLED makrosu tanımlanmayacak.
INLINE_ENABLED makrosu tanımlanırsa neco.hpp başlık dosyası neco.ipp dosyasını dahil edecek. Bu durumda neco.ipp dosyasından gelen Neco::func işlevinin tanımı Neco sınıfının tanımının altında yer alacak.
INLINE makrosu inline anahtar sözcüğüyle yer değiştirecek. Bu durumda neco.hpp dosyası şu hale gelmiş olacak:
1 2 3 4 5 6 7 8 9 10 |
class Neco { public: void func(); }; inline void Neco::func() { //kodlar } |
1 |
#ifndef INLINE_ENABLED |
1 |
#define INLINE |
Şimdi de INLINE_ENABLED makrosunun tanımlanmaması durumuna bakalım:
neco.hpp dosyasında
1 |
#ifdef INLINE_ENABLED |
1 2 3 4 5 |
class Neco { public: void func(); }; |
1 2 3 4 |
void Neco::func() { //kodlar } |