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