Object C学习笔记22-#define 用法

简介:   上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 。而在c中还有另外一个很重要的关键字#define.   一. #define 简介     在C中利用预处理代码,可以让你的代码变得更加具有可读性,更加符合个人的编码风格,这也是C的强大之处。

  上一篇讲到了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 不能

 

相关文章
Object.defineProperty用法详解,简单易懂!学起来嘎嘎快!
【10月更文挑战第20天】Object.defineProperty用法详解,简单易懂!学起来嘎嘎快!
Object.defineProperty用法详解,简单易懂!学起来嘎嘎快!
|
前端开发
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用1
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用1
57 0
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用1
|
前端开发
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用2
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用2
50 0
|
前端开发
前端学习笔记202306学习笔记第四十一天-Es6-object.defineProperty监听属性的访问和设置1
前端学习笔记202306学习笔记第四十一天-Es6-object.defineProperty监听属性的访问和设置1
51 0
|
前端开发
前端学习笔记202306学习笔记第四十一天-Es6-object.defineProperty监听属性的访问和设置3
前端学习笔记202306学习笔记第四十一天-Es6-object.defineProperty监听属性的访问和设置3
54 0
|
7月前
|
SQL Java 关系型数据库
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
127 0
|
7月前
|
前端开发 JavaScript 容器
你知道css中的object-fit的用法吗?
你知道css中的object-fit的用法吗?
184 0
|
Java
JAVA_Object 类的用法
JAVA_Object 类的用法
62 0
|
前端开发
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用4深度拷贝
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用4深度拷贝
50 0
|
前端开发
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用3
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用3
39 0