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