Objective-C Ön İşlemcileri
Objective-C Preprocessorderleyicinin bir parçası değildir, ancak derleme sürecinde ayrı bir adımdır. Basit bir ifadeyle, bir Objective-C Ön İşlemcisi yalnızca bir metin ikame aracıdır ve derleyiciye gerçek derlemeden önce gerekli ön işlemeyi yapması talimatını verir. Objective-C Ön İşlemcisinden OCPP olarak bahsedeceğiz.
Tüm önişlemci komutları bir pound sembolü (#) ile başlar. Boş olmayan ilk karakter olmalı ve okunabilirlik için bir önişlemci yönergesi ilk sütundan başlamalıdır. Aşağıdaki bölüm, tüm önemli önişlemci direktiflerini listeler -
Sr.No. | Yönerge ve Açıklama |
---|---|
1 | #define Ön işlemci makrosunun yerini alır |
2 | #include Başka bir dosyadan belirli bir başlık ekler |
3 | #undef Bir önişlemci makrosunu tanımlar |
4 | #ifdef Bu makro tanımlanmışsa doğru döndürür |
5 | #ifndef Bu makro tanımlanmamışsa doğru döndürür |
6 | #if Derleme zamanı koşulunun doğru olup olmadığını test eder |
7 | #else #İf için alternatif |
8 | #elif #else an #if tek bir ifadede |
9 | #endif Önişlemci koşullu sona erer |
10 | #error Stderr üzerine hata mesajı yazdırır |
11 | #pragma Standartlaştırılmış bir yöntem kullanarak derleyiciye özel komutlar verir |
Önişlemci Örnekleri
Çeşitli direktifleri anlamak için aşağıdaki örnekleri analiz edin.
#define MAX_ARRAY_LENGTH 20
Bu yönerge OCPP'ye MAX_ARRAY_LENGTH örneklerini 20 ile değiştirmesini söyler . Okunabilirliği artırmak için sabitler için #define kullanın .
#import <Foundation/Foundation.h>
#include "myheader.h"
Bu direktifler OCPP'ye vakıf.h'yi almasını söyler. Foundation Frameworkve metni geçerli kaynak dosyaya ekleyin. Sonraki satır OCPP'ye,myheader.h yerel dizinden ve içeriği geçerli kaynak dosyaya ekleyin.
#undef FILE_SIZE
#define FILE_SIZE 42
Bu, OCPP'ye mevcut FILE_SIZE tanımını kaldırmasını ve 42 olarak tanımlamasını söyler.
#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif
Bu, OCPP'ye MESAJI yalnızca MESAJ önceden tanımlanmamışsa tanımlamasını söyler.
#ifdef DEBUG
/* Your debugging statements here */
#endif
Bu, OCPP'ye, DEBUG tanımlanmışsa eklenen ifadeleri işlemi yapmasını söyler. Bu, derleme sırasında -DDEBUG bayrağını gcc derleyicisine iletirseniz kullanışlıdır . Bu, DEBUG'ı tanımlar, böylece derleme sırasında hata ayıklamayı anında açıp kapatabilirsiniz.
Önceden Tanımlanmış Makrolar
ANSI C, bir dizi makro tanımlar. Her biri programlamada kullanımınız için mevcut olsa da, önceden tanımlanmış makrolar doğrudan değiştirilmemelidir.
Sr.No. | Makro ve Açıklama |
---|---|
1 | __DATE__ "AA GG YYYY" biçiminde bir karakter değişmez değeri olarak geçerli tarih |
2 | __TIME__ "SS: DD: SS" biçiminde bir karakter değişmez değeri olarak geçerli saat |
3 | __FILE__ Bu, geçerli dosya adını bir dize değişmezi olarak içerir. |
4 | __LINE__ Bu, mevcut satır numarasını bir ondalık sabit olarak içerir. |
5 | __STDC__ Derleyici ANSI standardıyla uyumlu olduğunda 1 olarak tanımlanır. |
Aşağıdaki örneği deneyelim -
#import <Foundation/Foundation.h>
int main() {
NSLog(@"File :%s\n", __FILE__ );
NSLog(@"Date :%s\n", __DATE__ );
NSLog(@"Time :%s\n", __TIME__ );
NSLog(@"Line :%d\n", __LINE__ );
NSLog(@"ANSI :%d\n", __STDC__ );
return 0;
}
Yukarıdaki kod bir dosyada olduğunda main.m derlenir ve yürütülürse aşağıdaki sonucu verir -
2013-09-14 04:46:14.859 demo[20683] File :main.m
2013-09-14 04:46:14.859 demo[20683] Date :Sep 14 2013
2013-09-14 04:46:14.859 demo[20683] Time :04:46:14
2013-09-14 04:46:14.859 demo[20683] Line :8
2013-09-14 04:46:14.859 demo[20683] ANSI :1
Önişlemci Operatörleri
Objective-C ön işlemcisi, makro oluşturmanıza yardımcı olmak için aşağıdaki operatörleri sunar:
Makro Devam (\)
Bir makro genellikle tek bir satırda yer almalıdır. Makro devam operatörü, tek bir satır için çok uzun olan bir makroya devam etmek için kullanılır. Örneğin -
#define message_for(a, b) \
NSLog(@#a " and " #b ": We love you!\n")
Stringize (#)
Dizgi oluşturma veya sayı işareti operatörü ('#'), bir makro tanımında kullanıldığında, bir makro parametresini bir dize sabitine dönüştürür. Bu operatör yalnızca belirli bir bağımsız değişken veya parametre listesine sahip bir makroda kullanılabilir. Örneğin -
#import <Foundation/Foundation.h>
#define message_for(a, b) \
NSLog(@#a " and " #b ": We love you!\n")
int main(void) {
message_for(Carole, Debra);
return 0;
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
2013-09-14 05:46:14.859 demo[20683] Carole and Debra: We love you!
Jeton Yapıştırma (##)
Bir makro tanımındaki belirteç yapıştırma operatörü (##) iki bağımsız değişkeni birleştirir. Makro tanımındaki iki ayrı simgenin tek bir belirteç olarak birleştirilmesine izin verir. Örneğin -
#import <Foundation/Foundation.h>
#define tokenpaster(n) NSLog (@"token" #n " = %d", token##n)
int main(void) {
int token34 = 40;
tokenpaster(34);
return 0;
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
2013-09-14 05:48:14.859 demo[20683] token34 = 40
Nasıl oldu, çünkü bu örnek, önişlemciden aşağıdaki gerçek çıktıyı veriyor -
NSLog (@"token34 = %d", token34);
Bu örnek, ## n belirtecinin belirteç34'e birleştirilmesini gösterir ve burada ikisini de kullandık stringize ve token-pasting.
Tanımlı () Operatör
Önişlemci definedoperatörü, bir tanımlayıcının #define kullanılarak tanımlanıp tanımlanmadığını belirlemek için sabit ifadelerde kullanılır. Belirtilen tanımlayıcı tanımlanmışsa, değer doğrudur (sıfır olmayan). Sembol tanımlanmamışsa, değer yanlıştır (sıfır). Tanımlanan operatör şu şekilde belirtilir -
#import <Foundation/Foundation.h>
#if !defined (MESSAGE)
#define MESSAGE "You wish!"
#endif
int main(void) {
NSLog(@"Here is the message: %s\n", MESSAGE);
return 0;
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
2013-09-14 05:48:19.859 demo[20683] Here is the message: You wish!
Parametreli Makrolar
OCPP'nin güçlü işlevlerinden biri, parametreli makrolar kullanarak işlevleri simüle etme yeteneğidir. Örneğin, bir sayının karesini almak için aşağıdaki gibi bir kodumuz olabilir -
int square(int x) {
return x * x;
}
Yukarıdaki kodu bir makro kullanarak aşağıdaki gibi yeniden yazabiliriz -
#define square(x) ((x) * (x))
Bağımsız değişkenli makrolar, #definekullanılmadan önce yönergesi. Bağımsız değişken listesi parantez içine alınır ve makro adını hemen takip etmelidir. Makro adı ve açık parantez arasında boşluklara izin verilmez. Örneğin -
#import <Foundation/Foundation.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void) {
NSLog(@"Max between 20 and 10 is %d\n", MAX(10, 20));
return 0;
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
2013-09-14 05:52:15.859 demo[20683] Max between 20 and 10 is 20