Object C学习笔记22-#define 用法
2014-04-03 22:18 贺臣 阅读(4065) 评论(3) 编辑 收藏 举报上一篇讲到了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 不能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架