Önişlemciler gerçek derleme başlamadan önce kaynak kodunu işleyen programlardır. Derleme sürecinin bir parçası değildirler ancak ayrı ayrı çalışarak programcıların derlemeden önce kodu değiştirmesine olanak tanırlar.
- Bu, C kaynak kodunun yürütülebilir bir dosyaya dönüştürülürken geçtiği ilk adımdır.
- Önişlemci Direktiflerinin ana türleri şunlardır: Makrolar Dosya Ekleme Koşullu Derleme ve #undef #pragma vb. gibi diğer yönergeler.
- Temel olarak bu direktifler, C kodunun belirli bir bölümünü başka bir C koduyla değiştirmek için kullanılır. Örneğin '#define PI 3.14' yazarsak önişlemci tarafından PI 3.14 ile değiştirilir.
C Ön İşlemci Türleri
Yukarıdaki önişlemcilerin tümü 4 türe ayrılabilir:
Makrolar
Makrolar sabitleri tanımlamak veya kod derlenmeden önce ön işlemci tarafından değiştirilen işlevler oluşturmak için kullanılır. İki ön işlemci #tanımlamak Ve #undef C'de makro oluşturmak ve kaldırmak için kullanılır.
#tanımlamak belirteç değeri
#undef jeton
ön işleme tabi tutulduktan sonra jeton kapsamına genişletilecek değer programda.
Örnek:
C#include // Macro Definition #define LIMIT 5 int main(){ for (int i = 0; i < LIMIT; i++) { printf('%d n' i); } return 0; }
Çıkış
0 1 2 3 4
Yukarıdaki programda derleme başlamadan önce LIMIT kelimesi 5 ile değiştirilmiştir. 'SINIR' makro tanımında makro şablonu denir Ve '5' makro genişlemedir.
Not Makro tanımının sonunda noktalı virgül (;) yoktur. Makro tanımlarının sona ermesi için noktalı virgül gerekmez.
Ayrıca bazıları var C'de Önceden Tanımlanmış Makrolar programımıza çeşitli işlevler sağlamada faydalıdır.
Daha önce tanımlanmış bir makro, #undef önişlemcisi kullanılarak tanımsız hale getirilebilir. Örneğin yukarıdaki kodda
C#include // Macro Definition #define LIMIT 5 // Undefine macro #undef LIMIT int main(){ for (int i = 0; i < LIMIT; i++) { printf('%d n' i); } return 0; }
Çıkış:
./Solution.c: In function 'main': ./Solution.c:13:28: error: 'MAX' undeclared (first use in this function) printf('MAX is: %dn' MAX); ^ ./Solution.c:13:28: note: each undeclared identifier is reported only once for each function it appears inArgümanlı Makrolar
Argümanları makrolara da aktarabiliriz. Bu makrolar işlevlere benzer şekilde çalışır. Örneğin
# tanımlamak foo(a b) a + b
#define func(r) r * r
Bunu bir programla anlayalım:
C#include // macro with parameter #define AREA(l b) (l * b) int main(){ int a = 10 b = 5; // Finding area using above macro printf('%d' AREA(a b)); return 0; }
Çıkış
Area of rectangle is: 50
Açıklama: Yukarıdaki programda makro ALAN(l b) bir dikdörtgenin alanını çarparak hesaplamak için tanımlanır uzunluk (l) Ve genişlik (b) . Ne zaman ALAN(a b) buna genişler denir (bir * b) sonuç hesaplanır ve yazdırılır.
Lütfen bakın C'deki Makro Türleri daha fazla örnek ve tür için.
Java'da soyutlama
Dosya Ekleme
Dosya ekleme, harici dosyaları (başlık dosyaları kitaplıkları vb.) geçerli programa eklemenizi sağlar. Bu genellikle kullanılarak yapılır. #katmak Hem sistem hem de kullanıcı tanımlı dosyaları içerebilen yönerge.
Sözdizimi
Başlık dosyalarını eklemenin iki yolu vardır.
#katmak
#katmak 'dosya adı'
'<' Ve '>' parantezleri derleyiciye dosyayı aramasını söyleyin standart dizin sırasında çift tırnak ('') derleyiciye kaynak dosyanın dizininde başlık dosyasını aramasını söyleyin.
Örnek:
C// Includes the standard I/O library #include int main() { printf('Hello World'); return 0; }
Çıkış
Hello World
Koşullu Derleme
Koşullu derleme belirli koşullara bağlı olarak kodun bazı bölümlerini eklemenize veya hariç tutmanıza olanak tanır. Bu, platforma özgü kod oluşturmak veya hata ayıklamak için kullanışlıdır. Aşağıdaki koşullu önişlemci direktifleri vardır: #if #ifdef #ifndef else #elif ve #endif
Sözdizimi
Koşullu önişlemcilerin genel sözdizimi şöyledir:
#eğer
// bazı kodlar
#elif
// biraz daha kod
#başka
// Biraz daha kod
#endif
#endif direktifi #if #ifdef ve #ifndef açma direktiflerini kapatmak için kullanılır.
Örnek
C#include // Defining a macro for PI #define PI 3.14159 int main(){ // Check if PI is defined using #ifdef #ifdef PI printf('PI is definedn'); // If PI is not defined check if SQUARE is defined #elif defined(SQUARE) printf('Square is definedn'); // If neither PI nor SQUARE is defined trigger an error #else #error 'Neither PI nor SQUARE is defined' #endif // Check if SQUARE is not defined using #ifndef #ifndef SQUARE printf('Square is not defined'); // If SQUARE is defined print that it is defined #else printf('Square is defined'); #endif return 0; }
Çıkış
PI is defined Square is not defined
Açıklama: Bu kod koşullu önişlemci direktiflerini kullanır ( #ifdef #elif ve #ifndef ) belirli makroların ( PI Ve KARE ) tanımlanır. PI tanımlandığı için program şunu yazdırır: PI tanımlandı ' ardından SQUARE'in tanımlı olup olmadığını kontrol eder ve yazdırır ' Kare tanımlanmadı '.
Diğer Direktifler
Birincil önişlemci direktiflerinin yanı sıra C, derleyici davranışını ve hata ayıklamayı yönetmek için başka direktifler de sağlar.
#pragma:
Derleyiciye davranışını kontrol etmesi için özel talimatlar sağlar. Uyarıları, ayar hizalamasını vb. devre dışı bırakmak için kullanılır.
Sözdizimi
#pragma direktif
#pragma direktiflerinden bazıları aşağıda tartışılmaktadır:
- #pragma başlangıcı: Bu direktifler, program başlatılmadan önce (kontrol main()'a geçmeden önce) çalıştırılması gereken fonksiyonları belirlememize yardımcı olur.
- #pragma çıkışı : Bu yönergeler, programdan çıkmadan hemen önce (kontrol main() işlevinden dönmeden hemen önce) çalıştırılması gereken işlevleri belirlememize yardımcı olur.
Örnek
C#include void func1(); void func2(); // specifying funct1 to execute at start #pragma startup func1 // specifying funct2 to execute before end #pragma exit func2 void func1() { printf('Inside func1()n'); } void func2() { printf('Inside func2()n'); } int main(){ void func1(); void func2(); printf('Inside main()n'); return 0; }
Çıkış
Inside main()
Yukarıdaki kod, GCC derleyicileri üzerinde çalıştırıldığında, beklenen çıktı şu şekildeyken, yukarıda verilen çıktıyı üretecektir:
Beklenen Çıktı
Inside func1() Inside main() Inside func2() Bunun nedeni GCC'nin #pragma başlatmayı veya çıkışı desteklememesidir. Ancak GCC derleyicilerinde beklenen çıktı için aşağıdaki kodu kullanabilirsiniz.
C#include void func1(); void func2(); void __attribute__((constructor)) func1(); void __attribute__((destructor)) func2(); void func1() { printf('Inside func1()n'); } void func2() { printf('Inside func2()n'); } int main() { printf('Inside main()n'); return 0; }
Çıkış
Inside func1() Inside main() Inside func2()
Yukarıdaki programda bazılarını kullandık. belirli sözdizimleri Böylece işlevlerden biri ana işlevden önce, diğeri ana işlevden sonra yürütülür.
Test Oluştur