Object C學習筆記22-#define 用法

賀臣發表於2014-04-03

  上一篇講到了typedef 關鍵字的使用,可以參考文章 Object C 學習筆記--typedef用法 。而在c中還有另外一個很重要的關鍵字#define.

  一. #define 簡介

    在C中利用預處理程式碼,可以讓你的程式碼變得更加具有可讀性,更加符合個人的編碼風格,這也是C的強大之處。#define可以實現程式碼的預處理,程式碼在編譯之前會被提前處理。

 

  二. 常量處理

    語法: #define 常量名 產量值

    #define 宣告主要用於將常量(或字串)賦予有意義的名字,這個和.NET中的常量const比較的類似。

#import <Foundation/Foundation.h>
#define NAME "abc"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSString *str=[[NSString alloc] initWithCString:NAME];
        NSLog(@"%@",str);
    }
    return 0;
}

    上面的程式碼定義了一個 NAME常量,常量的值為"abc", 測試的程式碼輸出了常量值。

    請注意格式。#define 命令之後為常量名,再之後為所賦的代替值,用空格隔開,結尾不需分號。如果#define一旦被定義,那麼就不能被修改,一般#define定義在一個檔案的頂部,在#import 之後。

 

  三.多個常量定義

    在上一篇寫到的typedef,使用typedef將同一個型別定義成不同的別名,而在#define中可以使用其他的#define定義。

#import <Foundation/Foundation.h>
#define NAME "abc"
#define A 2
#define B A*2

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSString *str2=[[NSString alloc] initWithFormat:@"%d",B];
        NSLog(@"%@",str2);
    }
    return 0;
}

    在程式碼中定義了一個A常量2,而在定義的常量B中定義了 B =A*2, B的定義使用了#define A。

 

  四. 巨集定義

    #define 宣告中還可以使用引數,並且可使用多個引數;這一特性被稱為“巨集”

#import <Foundation/Foundation.h>

#define func(x,y) ( (x) * (y))
#define myfun(x) (x * 5)
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        int value=func(5, 5);
        NSLog(@"%d",value);
        int x=myfun(5);
        NSLog(@"%d",x);
    }
    return 0;
}

    是不是很像一個函式的定義,在上面的程式碼定義了兩個巨集,func,myfun,他們都是一個表示式。使用帶引數的巨集定義可完成函式呼叫的功能,又能減少系統開 銷,提高執行效率。

 

  五. #define 和 typedef 的比較

    (1)#define 巨集定義可以使用 #ifdef ,#ifndef等來進行邏輯判斷,還可以使用#undef來取消定義

    (2)使用typedef定義的變數型別其作用範圍限制在所定義的函式或者檔案內,而使用#define 不能

 

相關文章