the preprocessor underlying c language features copyright © 2012 by yong-gu lee ([email protected])

21
The Preprocessor Underlying C Language Features Copyright © 2012 by Yong- Gu Lee ([email protected])

Upload: sydnie-jestice

Post on 15-Jan-2016

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

The PreprocessorUnderlying C Language Features

Copyright © 2012 by Yong-Gu Lee ([email protected])

Page 2: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

The Preprocessor

Page 3: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

The #define Statement• Analogous to doing a search and replace with a text editor; in this

case, the preprocessor replaces all occurrences of the defined name with its associated text.

• It is convention that all defined names be capitalized.#define TRUE 1#define FALSE 0 #define PI 3.141592654

• You can reference other defined values in your definitions as long as everything is defined at the time the defined name is used in the program.#define PI 3.141592654 #define TWO_PI 2.0 * PI

or#define TWO_PI 2.0 * PI #define PI 3.141592654

Page 4: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

#define IS_LEAP_YEAR year % 4 == 0 && year % 100 != 0 \ || year % 400 == 0

...if ( IS_LEAP_YEAR )...

• Normally, the preprocessor assumes that a definition is contained on a single line of the program. If a second line is needed, the last character on the line must be a backslash character. This character signals a continuation to the preprocessor and is otherwise ignored. The same holds true for more than one continuation line; each line to be contin- ued must end with a backslash character.

Page 5: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Macros

• Definitions are frequently called macros. This terminology is more often applied to definitions that take one or more arguments.

• This macro, called SQUARE, simply squares its argument:

• #define SQUARE(x) x*x

Page 6: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

The #import Statement

• #import "metric.h"• The double quotation marks around the header filename

instruct the preprocessor to look for the specified file in one or more file directories (typically, first in the directory that contains the source file, but the actual places the preprocessor searches can be specified in Xcode).

• Enclosing the filename within the characters < and > instead, as in

• #import <Foundation/Foundation.h>• causes the preprocessor to look for the include file only in the

special “system” header file directory or directories; the current directory will not be searched.

Page 7: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Conditional Compilation

• The #ifdef, #endif, #else, and #ifndef Statements

• #ifdef IPAD # define kImageFile @"barnHD.png”#else # define kImageFile @"barn.png”#endif

Page 8: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Underlying C Language Features

Page 9: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Arrays

int x[50];x[0] = 1;x[49] = 1;

• Initializing Array Elementsint integers[5] = { 0, 1, 2, 3, 4 };char word[] = { 'H', 'e', 'l', 'l', 'o', '!' };

Page 10: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Multidimensional array

int M[4][5] = {{ 10, 5, -3, 17, 82 },{ 9, 0, 0, 8, -7 },{ 32, 20, 1, 0, 14 },{ 0, 0, 8, 7, 6 }

};

• Indexing elements M[slow][fast]

M[1][4]

Page 11: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Blocks• Blocks are a recent extension to the C language. They are not part of the standard

ANSI C definition and were added to the language by Apple, Inc. Blocks look and act a lot like functions. The syntax takes some getting used to.

• You can pass arguments to blocks, just like you can to functions.• You can also return a value from a block. • Unlike a function, a block can be defined inside a function or method, and gets to

access any variables defined outside the block that are within its scope. In general, such variables can be accessed, but their values cannot be changed .There is a special __block modifier (that’s two under- score characters that precede the word block) that enables you to modify the value of a variable from inside the block.

• Blocks can be passed as arguments to functions and methods, and in Part II,“The Foundation Framework,” you’ll learn about some of the methods that expect to see a block passed as an argument. One of the advantages of blocks is that they can be dispatched by the system for execution by other processors or by other threads within your application.

Page 12: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Examplevoid printMessage (void) {

NSLog (@"Programming is fun."); }

• Here’s a block that accomplishes the same task:^(void){

NSLog (@"Programming is fun.");

}• A block is identified by a leading caret ^ character. It’s followed by

the parenthesized argument list that the block takes. In our case, our block takes no arguments, so we write void just as we did in the function definition.

Page 13: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

• You can assign this block to a variable called printMessage, as long as the variable is properly declared:

• void (^printMessage)(void) =^(void){

NSLog (@"Programming is fun."); };

• To the left of the equal sign we specify that printMessage is a pointer to a block that takes no arguments and returns no value. Note that the assignment statement is terminated by a semicolon.

• Executing a block referenced by a variable is done the same way a function is called:

• printMessage ();

Page 14: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

• A block can access variables within the scope in which it’s defined. The value of that variable is the value it has at the time the block is defined. You can’t by default modify the value of a variable defined outside a block.

int main (int argc, const char * argv[]){

@autoreleasepool { int foo = 10; void (^printFoo)(void) = ^(void) { NSLog (@"foo = %i", foo); }; foo = 15; printFoo (); } return 0;} 2012-04-04 23:33:36.395 Chapt13[4148:707] foo = 10

Page 15: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

__block modifierint main (int argc, const char * argv[]){

@autoreleasepool { __block int foo = 10; void (^printFoo)(void) = ^(void) { NSLog(@"foo = %i", foo); foo = 20; // ** THIS LINE GENERATES A COMPILER ERROR }; foo = 15; printFoo (); NSLog (@"foo = %i", foo); } return 0;} 2012-04-04 23:41:16.843 Chapt13[4213:707] foo = 15

2012-04-04 23:41:16.845 Chapt13[4213:707] foo = 20

Page 16: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Struct

int month = 7, day = 18, year = 2011; struct _date {

int month;int day;int year;

}; struct _date today;

typedef struct _date date

Page 17: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Pointers

• Pointers enable you to effectively represent complex data structures, change values passed as arguments to functions and methods, and more concisely and efficiently deal with arrays.

• int x,count = 10;• int *intPtr;• intPtr = &count;• x = *intPtr;• *intPtr = 5;

indirection operator

address operator

Page 18: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Pointers and Structures struct date

{ int month; int day; int year; }; struct date today, *datePtr; datePtr = &today; datePtr->month = 9; datePtr->day = 25; datePtr->year = 2011; NSLog (@"Today's date is %i/%i/%.2i.", datePtr->month, datePtr->day, datePtr->year % 100);

x->y == (*x).y

Page 19: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Pointers and Arrays#import <Foundation/Foundation.h>int arraySum (int* array, int n);

int arraySum (int* array, int n) { int sum = 0, *ptr; int *arrayEnd = array + n; for ( ptr = array; ptr < arrayEnd; ++ptr ) sum += *ptr; return (sum); }int main (int argc, const char * argv[]){ @autoreleasepool {

int values[10] = { 3, 7, -9, 3, 6, -1, 7, 9, 1, -5 }; NSLog (@"The sum is %i", arraySum (values, 10)); } return 0;}

declaration of function

2012-04-05 20:51:29.042 Chapt13[2941:707] The sum is 21

Page 20: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

The sizeof Operator

• Objective-C provides an operator called sizeof that you can use to determine the size of a data type or object. The sizeof operator returns the size of the specified item in bytes.

• sizeof (int) • sizeof (struct data_entry)

Page 21: The Preprocessor Underlying C Language Features Copyright © 2012 by Yong-Gu Lee (lygu@gist.ac.kr)

Command-Line Arguments

• int main (int argc, char *argv[]) • {• }• argc tells number of arguments + 1• each arguments can be reference by• argv[0] upto argv[argc-1]