Previously we learn how to create unions in ObjC: Objective-C : Unions


The Objective-C Preprocessor is not part of the compiler, but is a separate step in the compilation process. In simplistic terms, an Objective-C Preprocessor is just a text substitution tool and it instructs compiler to do required pre-processing before actual compilation. We'll refer to the Objective-C Preprocessor as the OCPP.

All preprocessor commands begin with a pound symbol (#). It must be the first nonblank character, and for readability, a preprocessor directive should begin in first column. Following section lists down all important preprocessor directives:




Substitutes a preprocessor macro


Inserts a particular header from another file


Undefines a preprocessor macro


Returns true if this macro is defined


Returns true if this macro is not defined


Tests if a compile time condition is true


The alternative for #if


#else an #if in one statement


Ends preprocessor conditional


Prints error message on stderr


Issues special commands to the compiler using a standardized method


Preprocessors Examples

Analyze the following examples to understand various directives.


This directive tells the OCPP to replace instances of MAX_ARRAY_LENGTH with 20.

Use #define for constants to increase readability.

#import< Foundation/Foundation.h>
#include "myheader.h"

These directives tell the OCPP to get foundation.h from Foundation Framework and

add the text to the current source file. The next line tells OCPP to get myheader.h

from the local directory and add the content to the current source file.

#undef  FILE_SIZE
#define FILE_SIZE 42

This tells the OCPP to undefine existing FILE_SIZE and define it as 42.

#ifndef MESSAGE
   #define MESSAGE "You wish!"

This tells the OCPP to define MESSAGE only if MESSAGE isn't already defined. 

#ifdef DEBUG
   /* Your debugging statements here */

This tells the OCPP to do the process the statements enclosed if DEBUG is defined.

This is useful if you pass the -DDEBUG flag to gcc compiler at the time of

compilation. This will define DEBUG, so you can turn debugging on and off on the

fly during compilation.


Predefined Macros

ANSI C defines a number of macros. Although each one is available for your use in

programming, the predefined macros should not be directly modified.




The current date as a character literal in "MMM DD YYYY" format


The current time as a character literal in "HH:MM:SS" format


This contains the current filename as a string literal.


This contains the current line number as a decimal constant.


Defined as 1 when the compiler complies with the ANSI standard.


Let's try the following example:

#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;


When the above code in a file main.m is compiled and executed, it produces the

following result:

2015-07-13 10:28:47.874 demo[18741] File :main.m

2015-07-13 10:28:47.875 demo[18741] Date :Jul 13 2015

2015-07-13 10:28:47.875 demo[18741] Time :10:28:47

2015-07-13 10:28:47.875 demo[18741] Line :8

2015-07-13 10:28:47.875 demo[18741] ANSI :1

Preprocessor Operators

The Objective-C preprocessor offers following operators to help you in creating


Macro Continuation (\)

A macro usually must be contained on a single line. The macro continuation

operator is used to continue a macro that is too long for a single line. For example:

#define  message_for(a, b)  \
    NSLog(@#a " and " #b ": We love you!\n")


Stringize (#)

The stringize or number-sign operator ('#'), when used within a macro definition,

converts a macro parameter into a string constant. This operator may be used only

in a macro that has a specified argument or parameter list. For example:

#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;


When the above code is compiled and executed, it produces the following result:

2015-07-13 10:31:02.425 demo[20392] Carole and Debra: We love you!


Token Pasting (##)

The token-pasting operator (##) within a macro definition combines two

arguments. It permits two separate tokens in the macro definition to be joined into

a single token. For example:

#import <Foundation/Foundation.h> 

#define tokenpaster(n) NSLog (@"token" #n " = %d", token##n) 

int main(void)


   int token34 = 40;  


   return 0;


When the above code is compiled and executed, it produces the following result:

2015-07-13 10:34:50.071 demo[22027] token34 = 40

How it happened, because this example results in the following actual output from the preprocessor:

NSLog (@"token34 = %d", token34);

This example shows the concatenation of token##n into token34 and here we have used both stringize and token-pasting. 

The defined() Operator

The preprocessor defined operator is used in constant expressions to determine if an identifier is defined using #define. If the specified identifier is defined, the value is true (non-zero). If the symbol is not defined, the value is false (zero).

The defined operator is specified as follows:

#import <Foundation/Foundation.h> 

#if !defined (MESSAGE)

   #define MESSAGE "You wish!"



int main(void)


   NSLog(@"Here is the message: %s\n", MESSAGE); 

   return 0;


When the above code is compiled and executed, it produces the following result:

2015-07-13 10:41:28.997 demo[23961] Here is the message: You wish!

Parameterized Macros

One of the powerful functions of the OCPP is the ability to simulate functions using

parameterized macros. For example, we might have some code to square a

number as follows:

int square(int x) {
   return x * x;

We can rewrite above code using a macro as follows:

#define square(x) ((x) * (x))

Macros with arguments must be defined using the #define directive before they can be used. The argument list is enclosed in parentheses and must immediately follow the macro name. Spaces are not allowed between macro name and open parenthesis. For example:

#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;

When the above code is compiled and executed, it produces the following result:

2015-07-13 10:42:57.664 demo[24302] Max between 20 and 10 is 20

Next, we will learn about: Objective-C Log Handling

  Modified On Nov-30-2017 01:57:19 AM

Leave Comment